🍉Spring Authorization Server (1) 认证、授权、oauth2概念和流程初步介绍

4,035 阅读6分钟

认证和授权

认证

可以理解为 验证账号的合法性 就称之为认证。

例如登录QQ的时候,我们输入【QQ号+密码】进行登录,如果QQ号没有注册企鹅服务器就会返回QQ号未注册;如果QQ密码错误,企鹅服务器就会QQ密码错误;这些都是验证账号合法性的过程,这样一个验证的过程就是认证。

【QQ号+密码】登录 ,这个只是认证的一种方式,常见的认证方式:【账号+密码】;【手机号+验证码】;【二维码扫码】等。

授权

授权也是就字面含义,授予权限,我目前理解授权有两种:

  • oauth2的 授权给其他系统

oauth2授权:例如我们使用微信扫码登录掘金的时候 有这样一个页面,这个微信授权页面就是一个授权操作,【获取你的昵称、头像】如果允许,就授权给掘金有了可以从微信服务器中获取你微信昵称、头像的权限。

2.png

  • 角色授权

还有一种授权,例如我们自己开发的一个管理系统,管理系统里面有 用户、角色、资源;不同角色下面有不同的资源;我们的赋予用户拥有角色,也就是赋予拥有了系统资源,当我登录成功后对应用户有哪些角色就有哪些资源,哪用户可以操作对应的。

oauth2

OAuth 2.0实际是业界定义标准的授权协议,这个协议也就是统一定义的oauth2.0的认证授权的流程,业界都按照这个流程标准去执行。也就是所有大厂都按照以下流程开发的oauth2认证授权流程 。

OAuth 2.0 授权码流程图

sequenceDiagram
    participant U as User
    participant A as Application
    participant S as Authorization Server
    participant R as Resource Server
    participant C as Client

    U->>A: Request access token
    A->>S: Send authorization request
    S->>U: Send authorization code
    U->>C: Exchange authorization code for access token
    C->>S: Send access token request
    S->>C: Return access token
    C->>R: Use access token to access protected resources

OAuth 2.0 的协议流程通常涉及以下角色

  • 资源所有者(Resource Owner):资源的拥有者,通常是用户
  • 客户端(Client):第三方应用程序,希望访问资源所有者的资源。客户端通过向授权服务器进行请求来获取访问令牌。
  • 授权服务器(Authorization Server):负责验证资源所有者的身份,并向客户端颁发访问令牌,前提是资源所有者已经授权。
  • 资源服务器(Resource Server):存储资源的服务器,可以接受访问令牌并提供资源给客户端。

OAuth 2.0 定义了几种不同的授权流程

  • 授权码授权流程(Authorization Code Flow)
  • 隐式授权流程(Implicit Flow)
  • 密码授权流程(Password Credentials Flow)
  • 客户端凭证授权流程(Client Credentials Flow)
  • 设备授权流程(Device Flow)

每种授权流程都有其特定的用例和安全性考虑。OAuth 2.0 主要用于实现用户授权和认证,而 OpenID Connect 则是在 OAuth 2.0 基础上构建的,用于实现身份验证和提供用户信息的协议。这两者一起在构建安全的身份验证和授权系统时发挥重要作用。

OpenID Connect (OIDC) 1.0 的理解

OpenID Connect(OIDC)1.0 是建立在 OAuth 2.0 协议之上的一种身份验证和用户信息传输协议。它允许应用程序验证用户的身份,并获取有关用户的基本信息,同时利用 OAuth 2.0 提供的授权机制来访问受保护的资源。

OAuth 2.1 又是什么呢

OAuth 2.1 是 OAuth 2.0 协议的更新版本,旨在提供更好的安全性和实用性。OAuth 2.1 修复了 OAuth 2.0 中的一些安全漏洞和缺陷,以使开发人员更容易实现安全的身份验证和授权流程。OAuth 2.1 保留了 OAuth 2.0 的核心概念,但在一些方面进行了细化和改进,以提供更清晰、更安全的授权框架

Spring Authorization Server 是什么?

官方是这样描述的

Spring Authorization Server是一个框架,提供OAuth 2.1OpenID Connect 1.0规范以及其他相关规范的实现。它构建在Spring Security之上,为构建OpenID Connect 1.0 Identity Providers和OAuth2 Authorization Server产品提供了一个安全、轻量级和可定制的基础。

总结一下

Spring Authorization Server 实际上为了避免大家重复造轮子;每个大厂都要按照OAuth 2.1OpenID Connect 1.0规范去开发,是不是每一个厂都要自己再写这样一套的代码,Spring 大哥就把这个事情代劳了最后写出了Spring Authorization Server框架给我们用,当然也有 Spring Security的要干的事情,结合二者 就不用重复造轮子了。

主要特点和组成部分

  1. 身份验证(Authentication):OIDC 允许应用程序验证用户的身份。用户可以通过 OIDC 提供的机制进行登录,然后应用程序将收到一个 ID 令牌,证明用户已经通过身份验证。
  2. ID 令牌(ID Token):这是 OIDC 所引入的重要概念。ID 令牌是一个 JSON Web Token(JWT),其中包含有关用户身份的信息,如用户ID、姓名、电子邮件等。应用程序可以使用这个令牌来验证用户身份,避免了需要让用户提供用户名和密码。[到授权服务器获取token时,scope包含有openid是,会有id_token返回里面也包含了用户信息]
  3. 用户信息端点(UserInfo Endpoint):OIDC 规范定义了一个用户信息端点,允许应用程序通过访问令牌获取有关用户的详细信息,如头像、地址等。[授权服务器上也有一个端点-/userinfo,当然每个授权服务器的端点命名都不同,客户端的配置说明]
  4. 基于标准的扩展(Standard Extensions):OIDC 提供了一些扩展,以支持单点登录(Single Sign-On)和其他身份验证场景。例如,通过使用会话状态信息,用户可以在多个应用程序之间进行无缝的身份验证。
  5. 与 OAuth 2.0 的结合:OIDC 本质上是在 OAuth 2.0 的框架中添加了身份验证功能。它仍然使用 OAuth 2.0 的授权码、隐式、密码等流程,但添加了 ID 令牌和用户信息端点来支持身份验证和用户信息传递。

OpenID Connect 1.0 旨在通过在 OAuth 2.0 基础上添加身份验证和用户信息传递的功能,为应用程序提供更安全、更便利的用户身份验证和授权机制。这对于构建安全、可信的身份验证系统以及支持单点登录等功能非常重要。

Spring Authorization Server 和spring Security 中OAuth 2.0 流程图 举一个例示例如下:

sequenceDiagram
    participant U as 用户
    participant C as Client(掘金web)
    participant CA as Authorization Server(掘金授权服务)
    participant R as Resource-Server(掘金资源服务)
    participant A as GitHub Authorization Server(GitHub授权服务)

 U->>C: ①访问掘金个人中心
 C->>R: ②访个人中心页面需要登陆
 R->>C: ③重定向到掘金登陆页
 C->>CA: ④选择GitHub登陆
 CA->>A: ⑤重定向到github登陆页面
 A->>CA: ⑥GitHub登录成功后授权给Authorization Server
 CA->>C: ⑦Authorization Server生成授权码
 C->>CA: ⑧携带授权码换取token
 CA->>C: ⑨Authorization Server授权 Client 和返回token
 C->>R: ⑩Client 携带token 访问 Resource-Server
 R->>U: ⑪成功访问到个人中心

开始学习 Spring Authorization Server准备工作

我们可以直接下载 spring-authorization-server 最新的源码(当前最新1.1.x),因为源码里面有demo,但是spring-authorization-server是基于gradle构建的,并不是基于maven构建的,如果没有配置gradle环境的,下面也为大家提供maven环境的demo,以便于直接上手

  1. 👉 spring-authorization-server官方文档
  2. 👉 spring-security官方文档
  3. 👉 spring-authorization-server源码(源码里面有demo)
  4. 👉 基于maven的构建的spring-authorization-server源码demo

对于 spring-authorization-server 框架完全讲透的太少了,此专栏一定是讲透的,能够让你少走很多弯路!!