什么是OAuth2.0
1.用于rest/api的代理请求框架。
2.解耦认证和授权
3.基于令牌Token的授权,在无需暴露用户密码的情况下,让应用能获得对用户数据的访问权限。
4.事实上的标准安全框架,支持多种用例场景。适用于,服务端webapp,单页spa,原生app,服务器服务器之间。
OAuth2.0的优势
1.易于实现。
2.更加安全,客户端不接触密码,服务端集中保护。本质上就是解决这个问题。
3.广泛传播并持续采用。
4.短寿命和封装的token。
5. 资源服务器和授权服务器解耦。一个负责授予token权限(客户端访问其,其返回页面给用户,判断是否同意授权,同意,则授予让其有资格访问我的数据),一个负责判断请求是否具有token
6.集中授权
7.基于http/json,易于请求和传递token
8.考虑了多种客户端场景
9.客户端有多种信任级别。
OAuth2.0的不足
1.协议太宽泛了,因此各个实现版本兼容性不好。
2.和Oauth1.0不兼容。
3.Oauth2.0不是一个认证协议,他是个授权框架,他本省不会告诉你任何用户信息。是个授权协议。
Oauth2.0主要角色术语
1.资源拥有者:资源的拥有者,用户。
2.客户应用:通常是一个web应用,想要访问收到保护的数据。比如微信用户数据等。
3.资源服务器:一个web站点或者service api,客户想要访问的数据在我这里。
4.授权服务器:客户想要访问受保护的数据,必须先到我这里来认证,来获取到access token。
5.客户凭证:在授权服务器上注册后获得的,客户的ClientId和密码用于认证客户。
6.令牌:授权服务器接受到客户端请求后,验证后颁发的访问令牌
7.作用域:客户请求访问令牌是,由资源额外指定的细分权限。
Oauth2.0 令牌类型
1.access token:访问令牌用来代表一个用户或者服务直接去访问受保护的资源。
2.refresh token:刷新令牌,勇于去授权服务器获取一个新的令牌。(有时候访问令牌过期了,有的流程会支持获取到一个refreshtoken,我可以通过这个换取一个新的令牌)
3.Bearer Token:不管谁拿到token,都可以访问资源。
4.pop token:可以校验client是否对token的用友权。
5.Authorization Code Token:授权码,仅用于授权码授权类型。用于交换获取访问令牌和刷新令牌。
Ouath2.0的误区
1.该协议仅仅支持http协议。
2.Oauth 是个授权协议,不是认证协议。
3.oauth 没有定义token格式
4.没有定义加密算法
5.不是单个协议
6.没有定义授权处理机制
7.仅仅是个授权框架,用于授权代理
授权模式
授权码模式
用下面转载自码农翻身的一张图来解释下
1.用户访问客户端,客户端将用户重定向到授权服务器。同时附上客户端凭证和处理完后要重定向的url。
2.用户选择是否给予客户端授权。
3.用户给予授权,授权服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。
4.客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
5.认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
简化模式
(A)客户端将用户导向认证服务器。
(B)用户决定是否给于客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端指定的”重定向URI”,并在URI的Hash部分包含了访问令牌。
(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
(F)浏览器执行上一步获得的脚本,提取出令牌。
(G)浏览器将令牌发给客户端。
密码模式
这个通常需要客户端是操作系统的一部分,或者是一个著名公司出品,而认证服务器无法授权处理才使用。
(A)用户向客户端提供用户名和密码。
(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。
(C)认证服务器确认无误后,向客户端提供访问令牌。
客户端模式
其实不存在授权问题,客户端自己向授权服务器拿令牌。
(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。
(B)认证服务器确认无误后,向客户端提供访问令牌。
为何要加个授权码呢?
为了避免把token透露给浏览器,最好是透明的,我们不希望处理到这个token暴露在浏览器里面,每次重定向都会经过浏览器的。因此如果直接返回token的话就会产生问题。因此我们一般使用授权码的方式。