OAuth2.0 那点事
OAuth2.0
是什么?
OAuth2.0
Framework RFC 6749 [https://tools.ietf.org/html/rfc6749]
OAuth
就是一种授权机制,它介于客户端与资源所有者的授权层,为了分离不同的角色。
在资源所有者同意并向客户端颁发令牌后,客户端携带令牌可以访问部分或全部资源。
OAuth2.0 是OAuth 协议的一个版本,为2.0版本。有意思的是 2.0 与 1.0 并不兼容。
OAuth2.0
授权方式
获取授权的过程
- 授权码(authorization-code)
- 隐藏式(implicit)
- 密码(password)
- 客户端凭证(client credentials)
不管哪种方式,都需要在第三方应用申请令牌之前,需要在系统中申请身份唯一标识: 客户端ID Client ID 和 客户端秘钥 Client Secret. 这样能确保Token不被恶意使用。
授权重要的参数和指标:
- response_type 响应类型: code(要求返回授权码),token(要求返回授权Token)
- client_id 客户端身份标识
- client_secret 客户端秘钥
- redirect_uri 重定向地址
- scope 授权范围, read 只读权限, all 全部权限
- grant_type 授权方式 authorization_code(授权码)、password(密码)、client_credentials (凭证)、refresh_token(更新令牌)
- state 应用程序传递的一个随机数,防止 CSRF 攻击
授权码
在访问第三方应用先申请一个授权码,然后再用授权码获取令牌.这种方式也是最常用的流程,安全性也是最高的,适用于有后端的Web应用。授权码通过前端传送,令牌存储在后端。所有的和资源服务器的交互都在服务端完成,避免了令牌的泄露。 授权码和令牌的在 浏览器和客户端WEB应用以及资源服务器的交互流程大致如下:
- 1.2.3.4 用户选择 Google 登陆 yelp.com
- 3.4 Yelp.com 请求用户授权 Google 权限
- 5.6 用户同意后返回授权码
- 7.8 Yelp.com 通过授权码 会向 Google发起请求Token
- 9 验证必要参数,返回 Token
- 10.11 操作请求
隐藏式
密码式
顾名思议,在自己的系统输入第三方系统的账号密码,自己的系统拿账号密码去申请令牌,响应题里面返回token
凭证式
凭证式和密码很相似,主要给没有前端输入的项目或者命令行
令牌的使用和更新
令牌的使用
令牌的拿到了,就可以调用Google的API进行请求数据了, 一般讲 Token 放入请求头 Authorization.
令牌的更新
Token 是有时效性的,一旦过期就需要重新获取,但是重走一遍授权流程,不仅麻烦而且用户体验也不好,那如何让用户使用的优雅呢?
一般在颁发令牌的时候,颁发两个Token, 一个授权Token,一个Refresh Token, 在更新refresh_token时候,将grant_type指定为refresh_token, 参数refresh_token是用于更新Token的refresh_token
总结
安利
- Client
- Server
参考
- jsonwebtoken.io https://www.jsonwebtoken.io/
- oauth.net https://oauth.net/2/
- aliyun.com