【Spring Security】 Oauth2 颁发令牌端点

Metadata

title: 【Spring Security】 Oauth2 颁发令牌端点
date: 2023-02-03 11:06
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/SpringSecurity
categories:
  - SpringSecurity
keywords:
  - SpringSecurity
description: 【Spring Security】 Oauth2 颁发令牌端点

【Spring Security】 Oauth2 颁发令牌端点

在之前的文档中,通过[[【Spring Security】 Oauth2 开放平台授权服务四种授权模式|四种授权模式]]及接入[[【Spring Security】 Oauth2 开放平台 资源服务器|资源管理器]]案例,我们了解到,是 Security Oauth2 提供了很多获取令牌及检查令牌的端点。

我们知道在不使用 Oauth 时进行用户名登录时,是由 Security 中的过滤器获取参数,通过 UserDetailsService 获取数据库信息,最后调用认证管理器进行校验登录。

那么 Oauth2 这些端点是如何进行令牌颁发的呢,接下来深入分析一下。

核心类

AbstractEndpoint

AbstractEndpoint 就是 Oauth2 端点的父类,主要是维护了很多成员属性。

public class AbstractEndpoint implements InitializingBean {
    // Web 响应异常翻译器,将异常返回给客户端
    private WebResponseExceptionTranslator<OAuth2Exception> providerExceptionHandler = new DefaultWebResponseExceptionTranslator();
    // 访问令牌颁发对象
    private TokenGranter tokenGranter;
    // 获取OAuth2 客户端详细信息的服务
    private ClientDetailsService clientDetailsService;
    // 管理 OAuth2请求的策略
    private OAuth2RequestFactory oAuth2RequestFactory;

    private OAuth2RequestFactory defaultOAuth2RequestFactory;

    public void setProviderExceptionHandler(WebResponseExceptionTranslator<OAuth2Exception> providerExceptionHandler) {
        this.providerExceptionHandler = providerExceptionHandler;
    }
}

TokenGranter

TokenGranter 就是访问令牌授予者的接口。Oauth2 规范中定义了各种授权类型,每个类型都有一个实现。

每一个实现类就对应了一种授权类型:

ClientDetailsService

ClientDetailsService 就是加载客户端信息的地方了,是提供有关 OAuth2 客户端详细信息的服务。

有两个实现类:

InMemoryClientDetailsService 表示从内存中加载信息,常用的是 JdbcClientDetailsService,可以从数据库中加载客户端信息。

可以看到,JdbcClientDetailsService 定义了查询、修改、删除客户端的相关方法,如果我们自定义 Oauth2 表,就可以根据这个类来扩展或修改。

OAuth2RequestFactory

OAuth2RequestFactory 管理 OAuth2 请求的策略:{@link AuthorizationRequest}、{@link TokenRequest}、{@link OAuth2Request}。

它的主要用途是根据请求,获取请求参数或创建对象,创建不同的请求对象,比如 OAuth2Request、TokenRequest。

它只有一个默认实现类 DefaultOAuth2RequestFactory。

密码模式授权流程

首先回顾下密码模式,我们需要传递客户端的账号和密码,塞入消息头。消息头的格式为: