Oauth2.0的4种登录方式
笔者使用Oauth2.0有一段时间了,网上的很多文章都只是描述了Oauth2.0其中的一种登录方式--第三方授权登录,然而Oauth2.0的RFC 6749文件中,明确指出了Oauth2.0的四种登录方式:
1.Authorization Code Grant授权方式(第三方授权登录)
这是最常见的一种登录方式,登录的原理图如下:
(A)首先浏览器(上图显示为User Agent)将资源拥有者引导到认证节点(认证服务器),客户端(Client)包含了客户端的标识符、请求的范围、生成的status字段(用于避免csrf攻击),以及一个回调地址用于接收认证码(Authorization Code),认证服务器完成了鉴权操作后会调用这个回调URI
(B)通过浏览器,认证服务器验证了用户发过来的认证信息(用户名、密码),判断用户是否同意授权访问该资源。
(C)我们假设用户同意了访问特定资源的请求,认证服务器会向浏览器发送302跳转,引导浏览器跳转到步骤A所提供的回调URI,这个跳转会包含一个授权码(Authorization Code),以及在步骤A中提供的status字段。
(D)客户端(client)获取到授权码(Authorization Code)后,带上授权码(Authorization Code)向认证服务器发起获取access token的请求,同时在请求中带上了一个回调地址,该回调地址就是步骤C中的回调地址URI
(E)认证服务器校验了客户端的授权码(Authorization Code),以及确保了回调URI地址与步骤C中的回调URI一致时,认证服务器会返回一个access token
备注:
(1)上述的Authorization Code可以实现更加安全的避免中间人攻击,即使Authorization Code被截获了,依然不能获取到有效的access tokenm,因为认证服务器要秋特定的client Id加上Authorization Code才能获取access token,所以即使Authorization Code被黑客截获,也无法获取到access token,因为认证服务器只想特定的回调URI返回access token。
2.Implicit Grant(隐式授权)
使用该授权方式的客户端(Client)必须预先在认证服务器注册回调URI,详情见https://tools.ietf.org/html/rfc6749#section-3.1.2.2
原理图如下:
3.Password Credentials Grant(用户密码授权)
这种登录方式和我们平时使用的用户名与密码登录方式类似,原理图如下:
(A)用户把自己的username和password告诉客户端(Client)。
(B)客户端带上client_id、client_secret、username、password、scope(可选)等参数向认证服务器发起请求。
(C)认证服务器返回客户端(Client)一个access-token
注意:上述步骤(B)中client_id、client_secret是用于客户端(Client)的认证,保证这个客户端是一个认证的客户端。客户端认证的具体用途请查看Client Authentication
4.Client Credentials Grant
这种授权方式一般用于安全的客户端获取access token,这种方式只能用于安全可信赖的Client端
(A)用户直接向认证服务器发起请求
(B)认证服务器对客户端的认证信息进行校验,如果合法就通过认证,返回access token