目录
一、什么是OAuth2?
二、OAuth2中有哪些角色?
三、OAuth2的授权流程?
四、OAuth2令牌的特点?
五、OAuth2有哪些授权方式?
5.1 授权码
5.2 隐藏方式
5.3 密码方式
5.4 凭证方式
一、什么是OAuth2?
OAuth2就是当前使用非常广泛的一种授权机制,用于授权第三方应用获取用户的数据。
例如:
就比如我们平常用的京东,我们可以选择其他方式来进行登录,这样就是用到了第三方登录。
其中的流程用官方的话来讲的话就是:
OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者。......资源所有者同意
以后,资源服务器可以向客户端颁发令牌。客户端通过令牌,去请求数据。
第一次接触OAuth2的可能有点看不懂,没关系,后面我会逐个举例解释!
二、OAuth2中有哪些角色?
上面我们提到了一些名词,客户端、资源所有者...等等,其实这些就是OAuth2中的角色,这里我们就用大白话解释一下它们分别代表着什么?
① 资源所有者
能够授予被保护资源的访问权限的实体,就相当于我们使用微信登录、微信的账号所有人;
② 资源服务器
存储有受保护资源的服务器, 能够接受并验证访问令牌,并响应受保护资源的访问请求,这个就相当于第三方登录平台,比如微信、它的服务器;
③ 客户
需要被授权,然后再访问受保护资源的实体。客户这个术语,并不是特指应用程序,服务器,计算机等,在我们的日常例子中就相当于我们要登录的京东;
④ 授权服务器
验证资源所有者并获取授权成功后,向客户发出访问令牌;
三、OAuth2的授权流程?
这个授权流程我也就直接用我们生活中基本都经历过的实例来说明:
例子:使用第三方平台授权登录京东;
就如下图,Client相当于京东,ResourceOwner相当于我们自己(资源所有者),AuthorizationServer相当于授权服务器,ResourceServer相当于微信(资源服务器),京东发出授权请求,我们点击同意,然后京东就告诉授权服务器,授权服务器就会发送令牌给京东,京东拿着令牌就向微信请求数据,微信得到令牌返回数据;
四、OAuth2令牌的特点?
使用令牌方式的优点:
令牌有时效性,一般是短期的,且不能修改,密码一般是长期有效的
令牌可以由颁发者撤销,且即时生效,密码一般可以不用修改而长期有效
令牌可以设定权限的范围,且使用者无法修改
在使用令牌时需要保证令牌的保密,令牌验证有效即可进入系统,不会再做其他的验证。
五、OAuth2有哪些授权方式?
由于互联网有多种场景,
OAuth2
定义了四种获取令牌的方式,可以选择合适与自己的方式
授权码(
authorization-code
)
隐藏式(
implicit
)
密码式(
password
):
客户端凭证(
client credentials)
5.1 授权码
第三方应用先申请一个授权码,然后再用该码获取令牌。
最常见的用法,安全性高,适合
web
应用。 授权码通过前端传送,令牌则是储存在后端,而且所有与资
源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
流程如下:
1.
资源服务器提供一个链接,用户点击后就会跳转到认证服务器,授权用户数据给资源服务器使用,
资源服务器提供的连接的示例:
response_type=code
,表示使用授权码方式
client_id=CLIENT_ID
,请求者的身份
ID
https
:
//b.com/oauth/authorize?
response_type
=
code
&
client_id
=
CLIENT_ID
&
redirect_uri
=
CALLBACK_URL
&
scope
=
read
redirect_uri=CALLBACK_URL, 认证服务器接受请求之后的调转连接,可以根据这个连接将生成
的
code
发送给资源服务器
scope=read
,授权范围为只读
1.
页面跳转后,用户登录认证服务器,同意或拒绝资源服务器的授权请求,认证服务器根据上一步的
redirect_uri
地址,将生成的授权码返回给资源服务器。
code
返回的认证码
1.
客户拿到认证码之后,向认证服务器发给请求,申请令牌
client_id
资源服务器的身份
ID
client_secret=CLIENT_SECRET
安全参数,只能在后端发请求
grant_type=authorization_code
表示授权的方式为授权码
code=AUTHORIZATION_CODE
用来获取令牌的授权码
redirect_uri=CALLBACK_URL
令牌生成后的颁发地址
1.
认证服务器对授权码进行认证,通过后颁发令牌,
6.2
隐藏方式
隐藏方式合适的场景:
当
web
应用为纯前端应用没有后端,此时必须将令牌放在前端保存,省略了申请授权码的步骤。
https
:
//resouce.com/callback_url?code=AUTHORIZATION_CODE
https
:
//b.com/oauth/token?
client_id
=
CLIENT_ID
&
client_secret
=
CLIENT_SECRET
&
grant_type
=
authorization_code
&
code
=
AUTHORIZATION_CODE
&
redirect_uri
=
CALLBACK_URL
{
"access_token"
:
访问令牌
,
"token_type"
:
"bearer"
,
"expires_in"
:
过期时间
,
"refresh_token"
:
"REFRESH_TOKEN"
,
"scope"
:
"read"
,
"uid"
:
用户
ID
,
"info"
:{
...
}
}
5.2 隐藏方式
5.3 密码方式
5.4 凭证方式