一.前言
OAuth是一种安全相关的协议,用于用户授权第三方的应用程序访问用户的web资源,并不需要透露自己的密码。2007年1.0推出后迅速成为工业标准。OAuth2.0是全新的版本,不向下兼容1.0,但保留了与之前版本OAuth相同的整体架构。2.0关注开发者的易用性,提供web应用、手机、桌面应用等其他设备提供认证流程。2012年正式发布RFC6749.
二.认证授权过程
涉及三方:
服务提供方
用户
客户端
思想是在客户端与服务提供方之间设置一个授权层。其提供令牌(token)并且有权限范围和有效期。
OAuth 2.0中,server将发行一个短有效期的access token和长生命期的refresh token。这将允许客户端无需用户再次操作而获取一个新的access token,并且也限制了access token的有效期。
同意授权是关键。
三.客户端的授权模式
OAuth2.0定义了四种授权方式:授权码、简化、密码、客户端
不管哪一种授权模式,都必须到系统备案,说明自己的身份,拿到2个身份识别码:客户端ID(client ID)和客户端秘钥(client secret)。
1.授权码模式(authorization code)是功能最常用、完整、流程最严密的模式,特点是客户端的后台服务器与服务器提供商的认证服务器进行互动。第三方应用先申请一个授权码,然后再用该码获取令牌。授权码通过前端传送,令牌则是存储在后端,所有与资源服务器的通信都在后端完成。前后端分离,避免令牌泄露。
以微信登录为例:
1)A网提供链接其中包含回调链接,接受或拒绝请求后的跳转网址,用重定向302,Location
2)跳转到微信URL,要求用户登录,询问是否同意授权给A网。同意则微信跳回到回调URL(redirect_uri参数指定),会回传一个授权码
3)A网拿到授权码后,在后端,向微信请求令牌。
https://xxx/oauth/token? client_id=CLIENT_ID& client_secret=CLIENT_SECRET& grant_type=authorization_code& code=AUTHORIZATION_CODE& redirect_uri=CALLBACK_URL
client_id参数和client_secret参数用来让 微信 确认 A 的身份(client_secret参数是保密的,因此只能在后端发请求),grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码,code参数是上一步拿到的授权码,redirect_uri参数是令牌颁发后的回调网址。
4)微信收请求后,颁发令牌。向redirect_uri指定的网址,发送一段 JSON 数据。其中access_token字段就是令牌,refresh_token是刷新令牌。
2.隐蔽式,response_type参数为token
3.密码式,grant_type参数是授权方式,这里的password表示“密码式”
4.凭证式,grant_type参数等于client_credentials表示采用凭证式。
四. 更新令牌
令牌的有效期到了,如果让用户重新走一遍上面的流程,再申请一个新的令牌,很可能体验不好,而且也没有必要。OAuth 2.0 允许用户自动更新令牌。
这时候就用到refresh token 字段了,令牌到期前,用户使用 refresh token 发一个请求,去更新令牌。
https://xxx/oauth/token?
grant_type=refresh_token&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
refresh_token=REFRESH_TOKEN
grant_type参数为refresh_token表示要求更新令牌,client_id参数和client_secret参数用于确认身份,refresh_token参数就是用于更新令牌的令牌。
验证通过以后,就会颁发新的令牌。