oAuth是一个关于授权的开放网络标准,用来授权第三方应用,获取用户的数据。其最终的目的是为了给第三方应用颁发一个有时效性的令牌access_token,第三方应用根据这个access_token就可以去获取用户的相关资源,如用户显示名称,email这些信息。
OAuth 2.0基本授权机制:
- 客户端(应用程序)请求资源所有者(用户)的授权。
- 资源所有者同意给予应用程序授权,客户端收到授权准许。
- 客户端使用上一步获得的授权,向认证服务器申请令牌。
- 认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
- 客户端使用令牌,向资源服务器申请获取资源。
- 资源服务器确认令牌无误,同意向客户端开放资源。
OAuth2授权模式:授权码模式、隐藏式授权模式、用户名密码模式、客户端模式
OAuth 2.0的两种授权模式时序图
隐式授权模式需要注意的一点是Auth Server通过重定向链接(Location Header)返回的access_token是通过hash的形式返回的, 而不是像授权码模式中授权码一样是通过query返回的.
通过query返回的形式是:
https://client.com/oauth/callback?code=2YotnFZFEjr1zCsicMWpAA&state=xxxx
通过hash返回的形式是:
http://client.com/oauth/callback#access_token=ya29GAHES6ZSzX&token_type=Bearer&expires_in=3600
二者的区别在于query使用?
+参数, hash使用#
+参数. 前者的参数会随请求一起发送到uri对应的主机(即client.com服务器), 且参数存在于request url中, 会出现在后台请求日志中. 但后者实际是利用到fragment url特性(通常用作页内跳转锚), #
后的数据只会保留在浏览器中, 不会发往服务器, 因为参数不会传递到服务器, 因此就不会被拦截窃取.
由于隐式授权模式从Auth Server通过重定向得到的access_token仅保留在浏览器中, 因此应用后台想要获取它就只能在浏览器请求回调链接(即client.com)的时候向浏览器返回一段js脚本(通常包裹在html中), 由这段脚本获取hash参数, 然后发送给应用后台, js发送access_token的时候可以使用post请求提高安全性.
因此虽然隐式授权模式不能像授权码模式一样通过应用后台的post请求拿到access_token, 做到高度安全性, 但在access_token从浏览器发往应用后台的过程中, 也能一定程度保证数据安全性.
参考链接: https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html