OAuth 2.0 之 Authorization code 与 Implicit

简介: OAuth 2.0 之 Authorization code 与 Implicit

OAuth 2.0 之 Authorization code 与 Implicit

OAuth 2.0 是用于授权的行业标准协议。我们常见的比如第三方登录、授权第三方应用获取保存在其它服务商的个人数据,这种都是 OAuth 2.0 的应用场景。

OAuth 2.0 有四种授权方式:

Authorization code

Implicit

Resource Owner Password Credentials

Client Credentials

本文将会讲述其中的两种授权方式 Authorization codeImplicit


基本概念

角色

OAuth 定义了以下四种角色:

resource owner : 资源所有者,授予第三方客户端访问权限的实体。

resource server : 资源服务器,托管和保护资源的服务器,对持有访问令牌的资源请求做出响应。client : 客户端,代表资源所有者并在其授权下请求受保护的资源。

authorization server : 授权服务器,认证资源所有者并在其授权下向客户端颁发访问令牌( access token )。

例如我们使用微信登录某个第三方论坛,这时:

resource owner 资源所有者就是拥有微信账号的我们个人。

resource server 资源服务器则是微信的服务器,因为这里请求的资源其实是微信托管和保护的用户资源。

client 客户端就是这个第三方论坛。

authorization server 授权服务器也是微信的服务器,具体来说就是其中专门负责处理授权的模块或者服务。


你可以发现 resource serverauthorization server 其实是紧密相关的,如果服务器是单体架构,那么这两者就是同一个服务中的不同模块而已。

Access Token & Refresh Token

Access Token :访问令牌,持有 access token 就等于得到了用户授权从而可以访问某些资源,因为安全方面的考虑,access token 的有效时间一般较短。

Refresh Token :刷新令牌,使用 refresh token 可以获取新的 access tokenrefresh token 一般具有更长的有效期,这么做可以避免因为 access token 过期而导致需要用户频繁重新授权的情况。

客户端注册

例如我们要想使用微信登录某个第三方论坛,那么这个第三方论坛必须得先向微信那边去注册一下,表明自己是一个合法的第三方客户端,并且获取需要在后续授权过程中使用的一些参数。

在开始 OAuth 授权流程之前,客户端必须先完成注册,注册时一般需要提交以下信息:

声明客户端类型。

提供客户端重定向的 URI 。

其它信息,比如应用名称、网站地址、描述、logo、法律条款等等。


客户端注册完成后,一般会获取到以下两个参数:

client_id

client_secret

这两个参数在后续的授权过程中将会用到。

下面将会正式开始介绍 Authorization codeImplicit 这两种授权方式的整个过程。


uthorization code

Authorization code 授权码方式,这种方式最常用且安全性也很高。

Authorization code

如上图所示,整个过程为:

1、client 发起授权请求,例如:

GET /authorization?
    client_id=12345&
    redirect_uri=https://client-app.com/callback&
    response_type=code&
    scope=openid%20profile&
    state=ae13d489bd00e3c24
Host: oauth-authorization-server.com

请求包含以下参数:client_id :客户端注册后获取的唯一值。

redirect_uri :重定向地址。

response_type :值为 code 表明授权方式是授权码。

scope :访问数据的作用域。

state :当前会话的唯一值。


2、用户登录并确认授权。

3、浏览器重定向到客户端 redirect_uri 地址,并返回 code 授权码,例如:

GET /callback?
    code=a1b2c3d4e5f6g7h8&
    state=ae13d489bd00e3c24
Host: client-app.com

其中的 state 与发起请求的 state 应该一致。

前三步都是在浏览器环境中进行的,后面的步骤则是客户端服务器与 OAuth 服务器之间直接进行通信。

4、客户端发起请求,使用 code 交换 access token,例如:

POST /token
Host: oauth-authorization-server.com
client_id=12345&
client_secret=SECRET&
redirect_uri=https://client-app.com/callback&
grant_type=authorization_code&
code=a1b2c3d4e5f6g7h8

请求参数:

client_id :客户端注册后获取的 client_id。

client_secret :客户端注册后获取的 client_secret。

redirect_uri :客户端重定向地址。

grant_type :声明授权类型为 authorization_code

code :上一步获取的授权码


5、OAuth 服务器生成 access token 并响应数据,例如:

{
    "access_token": "z0y9x8w7v6u5",
    "token_type": "Bearer",
    "expires_in": 3600,
    "scope": "openid profile",
    ...
}

响应数据可能还包括 refresh token


6、客户端调用 API 请求资源,例如:

GET /userinfo HTTP/1.1
Host: oauth-resource-server.com
Authorization: Bearer z0y9x8w7v6u5

7、资源服务器响应:

{
    "username": "username",
    "email": "123@email.com",
    ...
}

以上就是一个完整的授权码授权并获取数据的过程。

Implicit

Implicit 称之为简化模式或者隐藏模式,过程更加简单,但安全性也有所降低。

Implicit

如上图所示,整个过程为:

1、 client 发起授权请求,例如:

GET /authorization?
    client_id=12345&
    redirect_uri=https://client-app.com/callback&
    response_type=token&
    scope=openid%20profile&
    state=ae13d489bd00e3c24
Host: oauth-authorization-server.com

请求包含以下参数:

client_id :客户端注册后获取的唯一值。

redirect_uri :重定向地址。

response_type :值为 token 表明授权方式是简化模式。

scope :访问数据的作用域。

state :当前会话的唯一值。


2、用户登录并确认授权。


3、直接生成 access token 并重定向到客户端地址:

GET /callback#
    access_token=z0y9x8w7v6u5&
    token_type=Bearer&
    expires_in=5000&
    scope=openid%20profile&
    state=ae13d489bd00e3c24
Host: client-app.com

重定向使用的是 # 连接参数,而不是 query 参数,这是因为浏览器对 URI 发起请求时不会携带 # 符号之后的数据,使用 # 也是安全方面的考虑。


4、客户端调用 API 请求资源。


5、资源服务器响应。


以上就是一个简化模式的整个过程。


结语

本文介绍了 OAuth 2.0 中的 Authorization codeImplicit 两张授权方式,前者最常用也更安全,后者更方便但安全性更低。


目录
相关文章
|
Oracle Java 关系型数据库
Linux环境安装配置JDK11
Linux环境安装配置JDK11
1364 0
debian11换源
直接编辑 /etc/apt/sources.list 文件
1580 0
|
NoSQL Java 关系型数据库
秒杀场景下如何保证数据一致性?就这个问题我给出了最详细的方案
本文主要讨论秒杀场景的解决方案。 什么是秒杀? 从字面意思理解,所谓秒杀,就是在极短时间内,大量的请求涌入,处理不当时容易出现服务崩溃或数据不一致等问题的高并发场景。 常见的秒杀场景有淘宝双十一、网约车司机抢单、12306抢票等等。
|
XML JSON Java
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
本文介绍了在Spring Boot中如何实现文件上传,包括单文件和多文件上传的实现,文件上传的表单页面创建,接收上传文件的Controller层代码编写,以及上传成功后如何在页面上遍历并显示上传的文件。同时,还涉及了`MultipartFile`类的使用和`@RequestPart`注解,以及在`application.properties`中配置文件上传的相关参数。
springboot文件上传,单文件上传和多文件上传,以及数据遍历和回显
Android.mk(makefile)中几个符号的区别:=、 :=、 ?=、 +=
本文解释了在Android.mk文件中使用的几种赋值符号的区别,包括`=`(基本赋值)、`:=`(覆盖赋值)、`?=`(条件赋值,仅在变量未赋值时操作)、`+=`(追加赋值),并通过实验演示了这些符号的具体行为和效果。
859 1
|
11月前
|
Java 编译器 UED
Arrays.asList() 数组转换成集合酿成的线上事故,差点要滚蛋了!
本文介绍了Java开发中使用`Arrays.asList()`方法将数组转换为集合时的一个常见陷阱。该方法返回的List是固定长度的,不支持添加或删除操作,直接使用可能导致线上故障。文章通过一次实际开发中的事故案例,分析了问题的原因,并提供了使用`java.util.ArrayList`进行封装的解决方案,以避免此类错误的发生。希望读者能从中吸取教训,提高代码的健壮性。
|
9月前
|
存储 小程序 前端开发
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
2960 12
|
jenkins Java 持续交付
Gitee+Jenkins+SonarQube代码上线的实战操作
通过以上步骤,就可以实现基于Gitee、Jenkins和SonarQube的代码上线流程,确保代码的质量和上线过程的自动化和可控性。在实际操作中,可以根据项目的具体需求和环境进行适当的调整和优化。
|
Kubernetes 网络协议 前端开发
Spring Cloud 整合 Nacos 指南
Spring Cloud 整合 Nacos 指南
39445 2
Spring Cloud 整合 Nacos 指南
|
XML 存储 JSON
C# | JSON格式与XML格式互相转换
JSON格式与XML格式是目前互联网上使用最为广泛的数据交换格式之一,而两种格式各自有着自己的特点和优势。 在实际开发中,我们经常需要将数据在不同的系统或模块之间进行传递和转换,而JSON格式和XML格式的互相转换是一项非常基础和必要的技能。 同时,对于需要将数据存储在不同的介质中的应用场景,比如在移动端本地存储数据,或者在服务器端将数据保存到文件或数据库中,也需要将JSON或XML格式进行相应的转换。 因此,熟练掌握JSON与XML格式互相转换的方法对于开发人员来说是非常重要的。在本文中,我们将介绍常用的JSON和XML互相转换的方法及其实现。
308 0
C# | JSON格式与XML格式互相转换