1、企业服务平台提供了OAuth的授权登录方式,可以让从企业服务平台打开的网页获取成员的身份信息,从而免去登录的环节。
2、统一登录认证,主要对于企业用户主动进行验证,统一登录认证成功后,会返回access_token,是携带企业用户信息(用户id),这个是关键区别,企业内部系统间互相访问时,接口可以通过access_token获取到当前请求的用户信息(用户id)和应用系统信息(oa系统)。
3、应用系统可以使用refresh_token对access_token进行刷新,续期使用,这样就无需重新登录获取用户授权。
4、企业服务平台和接入的企业内部应用系统的请求,均可通过access_token来获取成员的身份信息。
使用企业微信登录回调的授权码code进行授权,包括企业微信的客户端(手机端+PC端),web端,wecom-jssdk,小程序,移动端app。
用户客户端构造链接,需要配置redirect_uri,请查看企业微信官方文档,用户授权成功后,会回调返回授权码code,应用系统可以使用code获取企业服务平台的access_token,refresh_token。
请求方式:POST(HTTPS) Content-Type: application/x-www-form-urlencoded
请求地址:
生产环境:https://esp.xkw.cn/oauth2/token
沙箱测试环境:https://esp.doc.xkw.cn/oauth2/token
详细说明开发者可以参考The OAuth 2.1 Authorization Framework
参数 | 必须 | 说明 |
---|---|---|
grant_type | 是 | 当前值为wecom_authorization_code |
agent_id | 是 | 企业微信应用agentid,与构造企业微信授权链接中agentid值要一样 |
code | 是 | 企业微信授权获取到的code,每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。 |
scope | 否 | 企业服务平台授权范围 |
client_id | 是 | 企业服务平台分配的client_id |
client_secret | 是 | 企业服务平台分配的client_secret |
参数 | 说明 |
---|---|
access_token | 访问令牌,调用开放接口的凭证 |
refresh_token | 刷新令牌,在refresh_token有效期内,都可以对access_token进行刷新 |
scope | 授权范围,返回授权请求允许的scope |
token_type | token类型 |
expires_in | access_token有效期,单位为秒 |
error_description | 错误描述 |
error_code | 错误码 |
error_uri | 错误详细说明地址 |
a) 成功返回示例如下:
{
"access_token": "eyJraWQiOiJjM2Q2ZDAxYiIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJ4eTA3NjE5IiwiYXVkIjoib2EiLCJuYmYiOjE3MTA0ODM1MDQsInNjb3BlIjpbIm9wZW5pZCJdLCJpc3MiOiJodHRwczovL2VzcC5kb2MueGt3LmNuIiwiZXhwIjoxNzEwNDgzODA0LCJpYXQiOjE3MTA0ODM1MDR9.KMjDHYIzpNiuX5O6T9MhgEhr0JDThJdWDBjSVlsGHk6YrTMRqNyMbuNS-Ws9kbxM_7klZD-qypUawOHSACRWh22fk9MNmbnIhd5Zwv4TYStwSmgY2Kt3bPi3LQMZA90_nTg_pSDxNZmaOyfV1XJj5GhvUSmd4V9j_N1i_bhBp45eIIFDgAJAwcnXhOkP7xyA8YZJOomzGL3d7j_7FzAgG-U85whKLl9QLQbOBadZvQXmd0KG9vEB1VOiATeXdpxs_ojgTfNgF8lrnQwRl_NYXlMlKck-VNn6uf-cb2zqnWU0z2DhLo5vIg9wqLZsn2ztV2nzEoeoZkvwwHEqI7V4RQ",
"refresh_token": "QETBCcijNppU_g9iQA1pO3BHqZ2CW3RReelBvlvouZvo-2bO4d0fJDUNK04CHhceXaBB9m3b-IXXrdlBdlzoBBe_c2nZ355es7xjQiBqhv1F9bRT_l9HNrKYCiP1QbDX",
"scope": "openid",
"token_type": "Bearer",
"expires_in": 299
}
b)失败返回示例如下:
{
"error_description": "code不正确",
"error_code": "100031",
"error_uri": "https://esp.xkw.cn/doc/error?q=error_code"
}
企业微信授权码模式与授权码模式不同的地方,就是没有返回id_token,但用户id可以从access_token中获取。
可以使用jwt解码工具进行内容查看
从右边解码内容,可以看出通过oa应用系统构造的授权链接请求,用户:xy07619,企业服务平台的相关信息,包括加密算法,公钥等;
按jwt规范进行内容解析,也可以通过jwt第三方库进行解析,获取payload中的sub值,就是用户id。
注意:在必要情况下,可以使用企业服务平台公钥进行签名验证,验证通过后,再解析内容,对其他信息进行验证,比如授权时间,开始时间,过期时间等;
企业服务平台和接入的企业内部应用系统的接口请求,均可通过access_token来获取成员的身份信息。
这里就要使用到时返回的access_token,解析后内容如下:
以上access_token,接口调用方不需要验证,如果需要调用企业服务开放接口或企业内部应用系统时,由对接的应用系统(接口提供方,详情查看“开放接口”说明文档)在接收到请求时,使用平台公钥进行验证;
以上内容解析出来,scope值仅仅是openid,只是一个例子,可以为空,目前企业服务平台仅认证,不授权。后续升级使用会统一通知。
接口返回access_token有效期为expires_in,单位是秒,调用方要做好token的缓存处理,
xxxxxxxxxx
缓存时间 = expires_in - 60 * 10
缓存时间只要将平台返回的expires_in减去10分钟即可。
注意:不要频繁请求获取access_token,以免被限流控制;
在http请求的header部分,增加以下内容,key为Authorization,value为"Bearer " + access_token值
key | Value |
---|---|
Authorization | Bearer eyJraWQiOiJjM2Q2ZDAxYiIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJ4eTA3NjE5IiwiYXVkIjoib2EiLCJuYmYiOjE3MTA0ODM1MDQsInNjb3BlIjpbIm9wZW5pZCJdLCJpc3MiOiJodHRwczovL2VzcC5kb2MueGt3LmNuIiwiZXhwIjoxNzEwNDgzODA0LCJpYXQiOjE3MTA0ODM1MDR9.KMjDHYIzpNiuX5O6T9MhgEhr0JDThJdWDBjSVlsGHk6YrTMRqNyMbuNS-Ws9kbxM_7klZD-qypUawOHSACRWh22fk9MNmbnIhd5Zwv4TYStwSmgY2Kt3bPi3LQMZA90_nTg_pSDxNZmaOyfV1XJj5GhvUSmd4V9j_N1i_bhBp45eIIFDgAJAwcnXhOkP7xyA8YZJOomzGL3d7j_7FzAgG-U85whKLl9QLQbOBadZvQXmd0KG9vEB1VOiATeXdpxs_ojgTfNgF8lrnQwRl_NYXlMlKck-VNn6uf-cb2zqnWU0z2DhLo5vIg9wqLZsn2ztV2nzEoeoZkvwwHEqI7V4RQ |