05 oauth2
2020-09-28 本文已影响0人
格林哈
- 平台商通过OAuth协议,提示用户对第三方软件厂商(ISV)进行授权,使得第三方软件厂商能够使用平台商的部分数据,对用户提供服务
- OAuth协议并不需要触及用户的账户信息,即用户名密码,便可以完成第三方对用户信息访问的授权
0 基础
- 第三方应用 首先要向平台商申请 appid,secret,设置回调地址。
1 授权类型
1.1 授权码模式
-
是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动
-
流程
- 用户访问第三方应用,第三方应用把用户引导向平台商。
- 用户在平台商页面输入账号密码,登录,授权。
- 用户给与授权,平台商 重定向 第三方用户回调地址 并附带一个授权码(如微信登陆的code)。
- 第三方应用拿授权码向平台商授权接口获取令牌(access_token)。
- 第三方应用通过 令牌(access_token) 获取平台商资源。
-
请求参数
- 请求参数说明
- grant_type=authorization_code
- code=回调地址回来获取到的code
- redirect_uri=从平台商申请的回调地址
- appid
- 请求例子
- 请求参数说明
-
响应主要参数
- access_token 访问令牌
- refresh_token 更新令牌
- scope 权限范围
{
"access_token": "37_iSnKFdlhiPaUUS8fcttaUc4arw1x__YxgPlflHUstbkIeiDFU6sO8MrJQ0Rhj1TCOV_jk68gKPLoOvKZeEHpLRt-x5smDrjYEYMBrZhb0",
"expires_in": 7200,
"refresh_token": "37_na1tDQsOrphZX3ybr6OyBX5hv7s1m1bW6oc0ry2GsYIjlH0mZs9ZjYQC_1q-ZHkCL4tXbl3gS4DDPy2EKgX72aLrTJujN_KfGIeVVilwc",
"openid": "oPG8J1m5cGDcpP1yE1I9v2mNGM",
"scope": "snsapi_login",
"unionid": "oBEh1523T_L6H_WBsV4pg-o8bmM"
}
1.2 简化模式
- 不需要通过客户端后台服务器,直接在浏览器中向认证服务器申请令牌,跳过了授权码这个步骤
- 对于简化模式获得的 access_token 有效期很短,一般是会话级的,即当会话结束时就失效
1.3 密码模式
- 用户向第三方应用提供用户和密码,第三方应用使用这些信息向平台商换取token
- 如 登录 网页端作为第三方应用,服务器是平台商。
- 请求主要参数
- grant_type=password
- username=用户名
- password=密码
- 如:
header 中
Authorization: Basic c2hhcmUtY2xpZW50LXVzYzpzaGNsaWVudFNlY3JldA==
http://dev.weepal.info/share-gateway/usc/auth/form?grant_type=password&username=13&password=13&imageCode=8259
1.4 客户端模式
-
第三方应用直接通过 appid,secret 向平台商获取令牌
-
请求主要参数
- grant_type=client_credentials
- Authorization请求头=Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
-
响应参数
- 没有refresh_token 参数
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyIqIl0sImV4cCI6MTU1OTAxOTAxNywianRpIjoiZGMzZGZiYTEtMGVmNy00ZTg1LWI1OTgtZmRiZjYwNzJiMmVhIiwiY2xpZW50X2lkIjoic2hhcmUtY2xpZW50LXVzYyIsInRpbWVzdGFtcCI6MTU1OTAxMTgxNzc1NX0.FN_y50MD0XuO2O5ooOS24_-1_t9XXXrhxi1eR47xajE",
"token_type": "bearer",
"expires_in": 7199,
"scope": "*",
"timestamp": "1559011817755",
"jti": "dc3dfba1-0ef7-4e85-b598-fdbf6072b2ea"
}
2 授权过程
- image.png
2.2 微信三方登录授权过程 (授权码模式)
- 一般授权流程
- 1 首先向微信申请 appid,secret 设置回调地址 http://dev.weepal.info/share/login
- 2 用户访问第三方应用登录页面,点击微信登陆,第三方应用返回一个引导向微信的链接
https://open.weixin.qq.com/connect/qrconnect?client_id=wxde780db2538135&response_type=code&redirect_uri=http%3A%2F%2Fdev.weepal.info%2Fshare%2Flogin&state=72fc22bd-a5-4166-b87d-0f04d2329b40&appid=wxde7db253813d05&scope=snsapi_login
- 3 如果用户授权了。重定向到第三方应用前端,前端带上授权码 访问 后端接口
http://dev.weepal.info/share-gateway/usc/shareSocial/auth/weixin?code=061O9S000uq3nK1qcA3007k0C62O9S0w&state=72fc22bd-18a5-4166-b87d-0f04d2329b40
- 4 后台根据 根据授权码拿到微信访问令牌(access_token),根据令牌获取 微信用户信息接口。根据返回的用户信息的唯一标识。
- 判断是否已经绑定过业务系统
- 绑定过 后台执行登录逻辑 返回前端 登录成功信息。
- 没绑定过, 给前端返回微信返回的用户信息
- 前端跳转到绑定微信界面,绑定完。
- 返回登陆成功信息
- 或者返回绑定成功重新登陆。
- 前端跳转到绑定微信界面,绑定完。
- 判断是否已经绑定过业务系统