一、什么是OAuth2
OAuth 是一个开放标准,该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等),而在这个过程中无需将用户名和密码提供给第三方应用。实现这一功能是通过提供一个令牌(token),而不是用户名和密码来访问他们存放在特定服务提供者的数据。采用令牌(token)的方式可以让用户灵活的对第三方应用授权或者收回权限。
传统的 Web 开发登录认证一般都是基于 session 的,但是在前后端分离的架构中继续使用 session 就会有许多不便,因为移动端(Android、iOS、微信小程序等)要么不支持 cookie(微信小程序),要么使用非常不便,对于这些问题,使用 OAuth2 认证都能解决。
二、OAuth2 的四种模式
- 授权码模式:
// 超链接可能有如下参数
https://wx.qq.com/oauth/authorize?response_type=code&client_id=javaboy&redirect_uri=www.javaboy.org&scope=all
分授权服务器(用来派发Token)和资源服务器,以用户授权微信登录某个网站为例,用户先点击超链接请求微信的授权服务器,授权服务器会校验客户端(APPID)及用户身份,网站拿到获取的授权码以及自己的相关信息去微信授权服务器请求token,微信的授权服务器校验过这些数据后,会发送一个token回来(一般在后端完成),接下来拿着这个token就可以去请求用户信息。
一般情况下我们认为授权码模式是四种模式中最安全的一种模式,因为这种模式我们的 access_token 不用经过浏览器或者移动端 App,是直接从我们的后台发送到授权服务器上,这样就很大程度减少了 access_token 泄漏的风险。
- 简化模式:
// 超链接类似如下
https://wx.qq.com/oauth/authorize?response_type=token&client_id=javaboy&redirect_uri=www.javaboy.org&scope=all
只有页面,没有后端,要求授权服务器直接返回access_token,用户点击超链接后跳转到微信登陆界面,然后用户进行登录,用户登录成功后微信会自动重定向到redirect_uri参数执行的跳转网址,同时携带上access_token。
因为没有后端,所以非常不安全
- 密码模式:
广泛应用于Spring Cloud,前提是高度信任第三方应用,用密码模式做鉴权非常适合用于微服务之间的调用
与授权码模式的参数略有差异,response_type的值为password表示密码式,另外多了用户名、密码参数,没有重定向的redirect_uri。微信校验过用户名密码后,直接在HTTP响应中把access_token返回给客户端
- 客户端模式:
有的应用可能只有一个后台
客户端发送一个请求到授权服务器:
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&client_id=APPID&client_secret=APPSECRET
授权服务器通过验证后直接返回access_token给客户端,户端模式给出的令牌,就是针对第三方应用的,而不是针对用户的。