OAuth2.0 四种授权模式(图解)

发布于:2023-02-19 ⋅ 阅读:(562) ⋅ 点赞:(0)

1. 四种模式

OAuth2.0提供了四种授权(获取令牌)方式,四种方式均采用不同的执行流程,让我们适应不同的场景。

1.0 前导知识

OAuth2.0中有四个重要角色:

OAauth2.0包括的角色 说明
客户端 本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如:Android客户端、Web客户端(浏览器端)、微信客户端等。
资源拥有者 通常为用户,也可以是应用程序,即该资源的拥有者。
授权服务器(也称认证服务器) 用于服务提供商对资源拥有的身份进行认证、对访问资源进行授权,认证成功后会给客户端发放令牌 (access_token),作为客户端访问资源服务器的凭据。本例为微信的认证服务器。
资源服务器 存储资源的服务器,本例子为微信存储的用户信息。

拿微信授权其他平台登录为例,该角色在流程中对应关系如下:

在这里插入图片描述

1.1 授权码模式

授权码模式流程如下 :

在这里插入图片描述

(1)资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。如:

/uaa/oauth/authorize? client_id=p2pweb&response_type=code&scope=app&redirect_uri=http://xx.xx/notify

参数列表如下:

参数 解释说明
client_id 客户端接入标识。
response_type 授权码模式固定为code。
scope 客户端权限。
redirect_uri 跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。

(2)浏览器出现向授权服务器授权页面,之后将用户同意授权。

(3)授权服务器将授权码(AuthorizationCode)转经浏览器发送给client(通过redirect_uri)。

(4)客户端拿着授权码向授权服务器索要访问access_token,请求如下:

/uaa/oauth/token?client_id=p2pweb&client_secret=gdjbcd&grant_type=authorization_code&code=5PgfcD&redirect_uri=http://xx.xx/notify

参数列表如下

参数 说明
client_id 客户端准入标识。
client_secret 客户端秘钥。
grant_type 授权类型,填写authorization_code,表示授权码模式
code 授权码,就是刚刚获取的授权码,
注意:授权码只使用一次就无效了,需要重新申请。
redirect_uri 申请授权码时的跳转url,一定和申请授权码时用的redirect_uri一致

(5)授权服务器返回令牌(access_token)

这种模式是四种模式中最安全的一种模式。一般用于Web服务器端应用或第三方的原生App调用资源服务的时候。

因为在这种模式中access_token不会经过浏览器或移动端的App,而是直接从服务端去交换,这样就最大限度的减小了令牌泄漏的风险。

1.2 密码模式

密码模式使用较多,适应于第一方的单页面应用以及第一方的原生App,比如:闪聚支付平台运营平台用户使用此模式完成用户登录。 密码模式认证流程如下:

在这里插入图片描述

(1)资源拥有者将用户名、密码发送给客户端

(2)客户端拿着资源拥有者的用户名、密码向授权服务器请求令牌(access_token),请求如下:

/uaa/oauth/token?client_id=p2pweb&client_secret=fgsdgrf&grant_type=password&username=shangsan&password=123456

参数列表如下:

参数 说明
client_id 客户端准入标识。
client_secret 客户端秘钥。
grant_type 授权类型,填写password表示密码模式
username 资源拥有者用户名。
password 资源拥有者密码

(3)授权服务器将令牌(access_token)

发送给client 这种模式十分简单,但是却意味着直接将用户敏感信息泄漏给了client,因此这就说明这种模式只能用于client是 我们自己开发的情况下。

因此密码模式一般用于我们自己开发的,第一方原生App或第一方单页面应用。

1.3 客户端模式

在这里插入图片描述

(1)客户端向授权服务器发送自己的身份信息,并请求令牌(access_token)

(2)确认客户端身份无误后,将令牌(access_token)发送给client,请求如下:

/uaa/oauth/token? client_id=p2pweb&client_secret=fgsdgrf&grant_type=password&username=shangsan&password=123456 /uaa/oauth/token?client_id=p2pweb&client_secret=fdafdag&grant_type=client_credentials

参数列表如下:

参数 说明
client_id 客户端准入标识。
client_secret 客户端秘钥。
grant_type 授权类型,填写client_credentials表示客户端模式

这种模式是最方便但最不安全的模式。

因此这就要求我们对client完全的信任,而client本身也是安全的。

因此这种模式一般用来提供给我们完全信任的服务器端服务。比如,合作方系统对接,拉取一组用户信息。

客户端模式适应于没有用户参与的,完全信任的一方或合作方服务器端程序接入。

1.3 简化模式

在这里插入图片描述
简化如下:
在这里插入图片描述

(1)资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。如:

/uaa/oauth/authorize? client_id=p2pweb&response_type=token&scope=app&redirect_uri=http://xx.xx/notify

参数列表如下:

参数 解释说明
client_id 客户端接入标识。
response_type 简化模式固定为token。
scope 客户端权限。
redirect_uri 跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。

参数描述同授权码模式 ,注意response_type=token,说明是简化模式。

(2)浏览器出现向授权服务器授权页面,之后将用户同意授权。

(3)授权服务器将授权码将令牌(access_token)以Hash的形式存放在重定向uri的fargment中发送给浏览器。

注:

fragment 主要是用来标识 URI 所标识资源里的某个资源,在 URI 的末尾通过 (#)作为 fragment 的开头, 其中 # 不属于 fragment 的值。如https://domain/index#L18这个 URI 中 L18 就是 fragment 的值。大家只需要

知道js通过响应浏览器地址栏变化的方式能获取到fragment 就行了。

一般来说,简化模式用于第三方单页面应用。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到