OAuth2.0认证
OAuth介绍
- Open Standard Authorization (OAuth)
- OAuth是一个网络开放协议。为保证用户资源的安全授权提供了简易的标准
特点:
- 简单:不管是OAUTH服务提供者还是应用开发者,都很易于理解与使用
- 安全:没有涉及到用户密钥等信息,更安全更灵活
- 开放:任何服务提供商都可以实现OAUTH,任何软件开发商都可以使用OAuth
OAuth2.0
- 2012年10月,OAuth 2.0协议正式发布为RFC 6749
- OAuth协议的下一版本,但不向后兼容OAuth 1.0
- OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程
OAuth2.0角色
resource owner: 资源所有者,指的是用户
resource server: 资源服务器,指的是应用服务器
client: 客户端,指的是应用
authorization server: 授权服务器,指的是应用服务器
OAuth2.0流程
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+
A: 客户端向资源所有者请求授权。这授权请求可以直接向资源所有者提出,或者最好通过授权间接服务器作为中介
B: 客户端收到授权授权,这是一个代表资源所有者授权的凭证
C: 客户端通过身份验证请求访问令牌 授权服务器并提供授权许可
D: 授权服务器对客户端进行身份验证并验证授权,如果有效,则颁发访问令牌
E: 客户端向资源请求受保护的资源 服务器并通过提供访问令牌进行身份验证
F: 资源服务器验证访问令牌,如果有效,则提供资源
OAuth2.0授权类型
- 授权码(Authorization Code)
- 隐藏式(implicit)
- 密码式(password)
- 客户端凭证(client credentials)
授权码授权类型(Authorization Code)
第三方应用先申请一个授权码,再通过授权码获取访问令牌。适合有后端的应用,比如网站应用。
scope参数
步骤:
- A网站提供一个链接,链接中包含本网站的跳转地址、网站的身份(client_id或app_key),点击后跳转到B网站
- B网站进行登陆,登陆成功后,跳转到A网站,并且在URL中携带一个授权码
- A网站拿到授权码,在后端携带授权码来请求A网站的接口(携带授权码、appkey、secretkey)
- B站收到请求,验证授权码,如果验证成功,则返回访问令牌,重刷令牌(access_token, refresh_token)
通常请求格式为: https://stolenzc.com/oauth/authorize?response_type=code&appkey=appkey&redirect_uri=redirect_uri&scope=scope
- response_type: 授权类型,必须为code
- appkey: 网站的身份,为应用在网站申请的appkey
- redirect_uri: 申请成功后网站的回跳地址
- scope: 网站的范围,可以为空,为空则表示全部范围,可以为多个范围,用逗号分隔
响应格式: 在回跳地址中携带授权码,比如:https://stolenzc.com/callback?code=1234567890
后台再请求令牌的格式: https://stolenzc.com/oauth/token?appkey=appkey&appsecret=appsecret&grant_type=authorization_code&code=code&redirect_uri=redirect_uri
- grant_type: 授权类型,必须为authorization_code
- appkey: 网站的身份,为应用在网站申请的appkey
- appsecret: 网站的身份,为应用在网站申请的appsecret,appsecret为保密的,所以只能在后端请求
- code: 授权码
- redirect_uri: 验证成功后授权方带上token数据请求该uri地址传递token数据
隐藏式授权类型(implicit)
第三方应用请求接口直接获取访问令牌。适合没有后端的应用,比如移动应用。
步骤:
- A网站提供一个链接,链接中包含本网站的跳转地址、网站的身份(client_id或app_key),点击后跳转到B网站
- B网站进行登陆,登陆成功后,跳转到A网站,并且在URL中以锚点的形式携带一个访问令牌
通常请求格式为: https://stolenzc.com/oauth/authorize?response_type=token&appkey=appkey&redirect_uri=redirect_uri&scope=scope
- response_type: 授权类型,必须为token
- appkey: 网站的身份,为应用在网站申请的appkey
- redirect_uri: 申请成功后网站的回跳地址
- scope: 网站的范围,可以为空,为空则表示全部范围,可以为多个范围,用逗号分隔
密码式授权类型(password)
第三方应用拿到用户账号密码,直接用账号密码获取令牌
- A网站要求用户提供账号和密码,拿到后A网站直接向B网站请求令牌
- B网站验证密码后,直接返回令牌,不需要进行跳转
请求令牌的格式: https://stolenzc.com/oauth/token?appkey=appkey&grant_type=password&username=username&password=password
- grant_type: 授权类型,必须为password
- appkey: 网站的身份,为应用在网站申请的appkey
- username: 用户名
- password: 密码
凭证式授权类型(client credentials)
凭证式适用于没有前端的命令行应用,通常是多个用户享用一个令牌,通常针对第三方应用,不是针对用户的。
- A应用在命令行向B应用发出接口请求,只需要携带appkey和secretkey即可
- B应用验证通过后,直接返回令牌
请求令牌的格式: https://stolenzc.com/oauth/token?grant_type=client_credentials&appkey=appkey&secretkey=secretkey
- grant_type: 授权类型,必须为client_credentials
- appkey: 网站的身份,为应用在网站申请的appkey
- secretkey: 网站的身份,为应用在网站申请的appsecret
使用令牌和令牌过期
后续请求资源的时候,需要将令牌放在请求头中携带
通常在申请令牌的时候,会同时返回一个refresh_token,用来在token失效的时候,重新申请一个新的令牌。
重刷令牌的格式: https://stolenzc.com/oauth/token?grant_type=refresh_token&appkey=appkey&secretkey=secretkey&refresh_token=refresh_token
- grant_type: 授权类型,必须为refresh_token
- appkey: 网站的身份,为应用在网站申请的appkey
- secretkey: 网站的身份,为应用在网站申请的appsecret
- refresh_token: 重刷令牌