Auth2.0 授权码模式个人分析思路
2017-07-22 23:21
381 查看
接口设计:获取code的接口+获取access_token+获取资源服务器
页面设计:登录页->授权页 (需要打开app并判断是否已登录,未登录先登录,已登录则调到授权页(可静默授权直接返回到 redirect_uri))
①建立一个开放平台用于开发者注册获取app key、app secret,然后app key与app secret会将数据存储到认证服务器 #此处需建立一个数据表(开发者信息表-developer 表、authorzation表)
开发者信息表(developer):id、app_key(相当于微信的appid、oauth2.0中的client_id)、app_secret、redirect_uri(授权后的回调地址)、code(用于记录授权码)、access_token、username、desc、created_at、updated_at
认证表(authorization):id、developer_id(索引对应的开发者信息)、user_id(用户id索引)、code、access_token、expires_in、created_at、updated_at #可合并到用户表
注:开放平台返回时可能会存在第三方应用的正式网址,但是这样可能会存在本地验证测试问题
②在客户端(即向我们开放平台申请用户信息的用户的站点)向认证服务器发起 类似以下请求
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz # 整个get请求需要强正则验证顺序
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 # redirect_uri写在开放文档中,用于认证完回调的的地址
Host: server.example.com # 认证服务器
请求到认证服务器,先判断是否已登录(未登录跳转到登录页面),反之跳转到用户授权页面(建议静默授权无需用户点击确认),授权后根据redirect_uri返回授权码(相应的authorzation认证表更新授权码code及updated_at)。
!!关键!!注:判断是否已登录和跳转到授权页面中间存在一个等待的长连接过程(可开一个进程用于维持长连接tcp或websocket用于及时更新到给对方状态)
上面想错了,可以使用session标记是否授权状态,决定用户是否登录后进而判断验证client_id返回授权码code
响应:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
注:以上是请求后返回的响应,state用于防止csrf攻击
③上一步获取了授权码code(get可获取),由于这里是经过用户授权通过后获取到的code,所以是安全的,发起请求如下:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
这里验证code、redirect_uri,然后更新authorization中 access_token、updated_at
??问题??:授权码要绑定用户吗?每一个用户对应一个授权码? 目前情况是分理处一个认证表(authorization)用于单独为每个用户绑定,最好就是将该表合并到用户表
响应:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store # 不得缓存
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
④获取access_token后即可获取指定资源(过期重新refresh_token即可)
参考资料: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html http://www.cnblogs.com/yuanloo/p/4330098.html
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
页面设计:登录页->授权页 (需要打开app并判断是否已登录,未登录先登录,已登录则调到授权页(可静默授权直接返回到 redirect_uri))
①建立一个开放平台用于开发者注册获取app key、app secret,然后app key与app secret会将数据存储到认证服务器 #此处需建立一个数据表(开发者信息表-developer 表、authorzation表)
开发者信息表(developer):id、app_key(相当于微信的appid、oauth2.0中的client_id)、app_secret、redirect_uri(授权后的回调地址)、code(用于记录授权码)、access_token、username、desc、created_at、updated_at
认证表(authorization):id、developer_id(索引对应的开发者信息)、user_id(用户id索引)、code、access_token、expires_in、created_at、updated_at #可合并到用户表
注:开放平台返回时可能会存在第三方应用的正式网址,但是这样可能会存在本地验证测试问题
②在客户端(即向我们开放平台申请用户信息的用户的站点)向认证服务器发起 类似以下请求
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz # 整个get请求需要强正则验证顺序
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1 # redirect_uri写在开放文档中,用于认证完回调的的地址
Host: server.example.com # 认证服务器
请求到认证服务器,先判断是否已登录(未登录跳转到登录页面),反之跳转到用户授权页面(建议静默授权无需用户点击确认),授权后根据redirect_uri返回授权码(相应的authorzation认证表更新授权码code及updated_at)。
!!关键!!注:判断是否已登录和跳转到授权页面中间存在一个等待的长连接过程(可开一个进程用于维持长连接tcp或websocket用于及时更新到给对方状态)
上面想错了,可以使用session标记是否授权状态,决定用户是否登录后进而判断验证client_id返回授权码code
响应:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
注:以上是请求后返回的响应,state用于防止csrf攻击
③上一步获取了授权码code(get可获取),由于这里是经过用户授权通过后获取到的code,所以是安全的,发起请求如下:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
这里验证code、redirect_uri,然后更新authorization中 access_token、updated_at
??问题??:授权码要绑定用户吗?每一个用户对应一个授权码? 目前情况是分理处一个认证表(authorization)用于单独为每个用户绑定,最好就是将该表合并到用户表
响应:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store # 不得缓存
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
④获取access_token后即可获取指定资源(过期重新refresh_token即可)
参考资料: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html http://www.cnblogs.com/yuanloo/p/4330098.html
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
相关文章推荐
- OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R
- OAuth 2.0 ——授权码模式
- vue2.0的虚拟DOM渲染思路分析
- 微信auth2.0授权
- 用DotNetOpenAuth实现基于OAuth 2.0的web api授权 (一)Getting Start
- 【JS 设计模式 】用组合模式来实现树形导航--代码结构思路分析(一)
- c#实现microsoft账号登入授权(OAuth 2.0)并获取个人信息
- BI系统的应用组织思路与数据分析模式
- 个人对23种设计模式总结 优缺点分析
- 从密码到token, 一个授权的故事 auth2.0
- 单例模式个人总结和优缺点分析
- BI系统的应用组织思路与数据分析模式
- 打造第二代测试框架TestDriven 2.0(六)—— 最新测试思路分析
- OAuth 2.0 构建微服务身份认证(一):授权模式选择
- 基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】
- 基于 IdentityServer3 实现 OAuth 2.0 授权服务【客户端模式(Client Credentials Grant)】
- [转]个人创业项目的选择及思路分析
- 权限管理 (一) 设计思路分析和实现授权、认证
- BI系统的应用组织思路与数据分析模式
- c#实现Google账号登入授权(OAuth 2.0)并获取个人信息