后端应用 Spring Security 的微服务安全架构

后端应用 Spring Security 的微服务安全架构

关键词:Spring Security、微服务安全架构、后端应用、认证、授权

摘要:本文深入探讨了在后端应用中运用 Spring Security 构建微服务安全架构的相关内容。首先介绍了背景知识,包括目的范围、预期读者等。接着阐述了核心概念与联系,详细说明了 Spring Security 的原理和架构,并通过 Mermaid 流程图直观展示。在核心算法原理部分,使用 Python 源代码阐述关键算法。同时给出了相关的数学模型和公式,并举例说明。通过项目实战,从开发环境搭建、源代码实现到代码解读进行了详细说明。分析了实际应用场景,推荐了学习资源、开发工具框架以及相关论文著作。最后总结了未来发展趋势与挑战,并提供了常见问题解答和扩展阅读参考资料,旨在帮助开发者全面掌握利用 Spring Security 构建微服务安全架构的技术。

1. 背景介绍

1.1 目的和范围

在当今数字化时代,微服务架构因其灵活性和可扩展性而被广泛应用于后端应用开发中。然而,微服务之间的通信和交互带来了诸多安全挑战,如身份认证、授权管理、数据加密等。本文章的目的在于深入探讨如何利用 Spring Security 框架构建一个安全可靠的微服务架构,以应对这些安全挑战。

文章的范围涵盖了 Spring Security 的核心概念、算法原理、数学模型、项目实战以及实际应用场景等方面。通过详细的讲解和实际案例分析,帮助开发者理解和掌握在微服务环境中使用 Spring Security 实现安全防护的方法。

1.2 预期读者

本文主要面向有一定后端开发经验,尤其是对微服务架构和 Java 开发有了解的开发者。包括但不限于后端开发工程师、软件架构师、安全工程师等。对于希望深入学习 Spring Security 并将其应用于微服务安全架构的技术人员,本文将提供有价值的参考。

1.3 文档结构概述

本文将按照以下结构进行组织:

  1. 背景介绍:介绍文章的目的、范围、预期读者和文档结构概述,以及相关术语。
  2. 核心概念与联系:阐述 Spring Security 的核心概念、原理和架构,并通过文本示意图和 Mermaid 流程图进行展示。
  3. 核心算法原理 & 具体操作步骤:使用 Python 源代码详细讲解 Spring Security 中的核心算法原理和具体操作步骤。
  4. 数学模型和公式 & 详细讲解 & 举例说明:给出相关的数学模型和公式,并进行详细讲解和举例说明。
  5. 项目实战:通过实际项目案例,详细介绍开发环境搭建、源代码实现和代码解读。
  6. 实际应用场景:分析 Spring Security 在微服务架构中的实际应用场景。
  7. 工具和资源推荐:推荐学习资源、开发工具框架和相关论文著作。
  8. 总结:未来发展趋势与挑战:总结利用 Spring Security 构建微服务安全架构的未来发展趋势和面临的挑战。
  9. 附录:常见问题与解答:提供常见问题的解答。
  10. 扩展阅读 & 参考资料:提供扩展阅读的建议和参考资料。

1.4 术语表

1.4.1 核心术语定义
  • Spring Security:是一个强大且高度可定制的身份验证和访问控制框架,用于保护基于 Spring 的应用程序。
  • 微服务架构:一种将单个应用程序拆分为多个小型、自治的服务的架构风格,每个服务都可以独立开发、部署和扩展。
  • 认证(Authentication):验证用户身份的过程,确定用户是否是其所声称的身份。
  • 授权(Authorization):在用户通过认证后,确定用户是否有权限访问特定的资源或执行特定的操作。
  • 令牌(Token):用于表示用户身份和权限的一种安全凭证,通常在认证成功后颁发给用户。
1.4.2 相关概念解释
  • OAuth 2.0:一种开放标准的授权协议,允许第三方应用通过获取用户的授权令牌来访问用户的资源。
  • JWT(JSON Web Token):一种轻量级的、基于 JSON 的开放标准(RFC 7519),用于在网络应用之间安全地传输声明。
  • 过滤器链(Filter Chain):Spring Security 中用于处理请求的一系列过滤器,每个过滤器负责不同的安全任务。
1.4.3 缩略词列表
  • JDK:Java Development Kit,Java 开发工具包。
  • MVC:Model-View-Controller,一种软件设计模式。
  • RESTful:Representational State Transfer,一种软件架构风格。

2. 核心概念与联系

2.1 Spring Security 核心概念

Spring Security 是 Spring 生态系统中的一个重要组件,主要用于处理身份验证和授权问题。其核心概念包括:

  • 认证管理器(AuthenticationManager):负责验证用户的身份,它接收一个 Authentication 对象作为输入,并返回一个经过验证的 Authentication 对象或抛出 AuthenticationException 异常。
  • 用户详细信息服务(UserDetailsService):用于从数据库或其他数据源中加载用户的详细信息,如用户名、密码、角色等。
  • 访问决策管理器(AccessDecisionManager):负责决定用户是否有权限访问特定的资源,它根据 Authentication 对象和访问规则进行判断。

2.2 Spring Security 架构

Spring Security 的架构基于过滤器链模式,每个过滤器负责不同的安全任务。当一个请求进入应用程序时,它会依次经过一系列的过滤器,直到被处理或被拒绝。

以下是 Spring Security 架构的文本示意图:

客户端请求 -> 过滤器链 -> 认证管理器 -> 用户详细信息服务 -> 访问决策管理器 -> 资源访问

2.3 Mermaid 流程图

客户端请求
过滤器链
认证管理器
用户详细信息服务
访问决策管理器
资源访问

3. 核心算法原理 & 具体操作步骤

3.1 认证算法原理

Spring Security 中常用的认证算法是基于用户名和密码的认证。其基本原理是:用户提交用户名和密码,Spring Security 将其封装成一个 UsernamePasswordAuthenticationToken 对象,然后将该对象传递给认证管理器进行验证。认证管理器会调用用户详细信息服务加载用户的详细信息,并比较用户输入的密码和数据库中存储的密码是否匹配。

以下是使用 Python 模拟 Spring Security 认证过程的示例代码:

# 模拟用户详细信息服务
class UserDetailsService:
    def load_user_by_username(self, username):
        # 这里简单模拟从数据库中加载用户信息
        if username == "admin":
            return {
                "username": "admin",
                "password": "password123",
                "roles": ["ROLE_ADMIN"]
            }
        return None

# 模拟认证管理器
class AuthenticationManager:
    def __init__(self, user_details_service):
        self.user_details_service = user_details_service

    def authenticate(self, username, password):
        user = self.user_details_service.load_user_by_username(username)
        if user and user["password"] == password:
            return {
                "username": user["username"],
                "roles": user["roles"]
            }
        return None

# 模拟客户端请求
username = "admin"
password = "password123"

user_details_service = UserDetailsService()
authentication_manager = AuthenticationManager(user_details_service)

result = authentication_manager.authenticate(username, password)
if result:
    print(f"认证成功,用户: {result['username']}, 角色: {result['roles']}")
else:
    print("认证失败")

3.2 授权算法原理

授权算法主要基于角色和权限的判断。在 Spring Security 中,可以通过配置访问规则来限制用户对特定资源的访问。例如,可以指定只有具有 ROLE_ADMIN 角色的用户才能访问某个接口。

以下是使用 Python 模拟 Spring Security 授权过程的示例代码:

# 模拟访问决策管理器
class AccessDecisionManager:
    def has_access(self, user, required_roles):
        user_roles = user.get("roles", [])
        for role in required_roles:
            if role not in user_roles:
                return False
        return True

# 模拟资源访问
user = {
    "username": "admin",
    "roles": ["ROLE_ADMIN"]
}
required_roles = ["ROLE_ADMIN"]

access_decision_manager = AccessDecisionManager()
if access_decision_manager.has_access(user, required_roles):
    print("授权成功,用户可以访问该资源")
else:
    print("授权失败,用户无权访问该资源")

3.3 具体操作步骤

在实际使用 Spring Security 时,具体操作步骤如下:

  1. 添加依赖:在项目的 pom.xmlbuild.gradle 中添加 Spring Security 的依赖。
  2. 配置 Spring Security:创建一个配置类,继承 WebSecurityConfigurerAdapter,并重写相关方法来配置认证和授权规则。
  3. 实现用户详细信息服务:创建一个类实现 UserDetailsService 接口,从数据库或其他数据源中加载用户的详细信息。
  4. 配置访问规则:在配置类中使用 http.authorizeRequests() 方法配置访问规则,指定哪些资源需要认证,哪些资源需要特定的角色才能访问。
  5. 处理异常:配置异常处理机制,当认证或授权失败时,返回合适的错误信息。

4. 数学模型和公式 & 详细讲解 & 举例说明

4.1 密码加密模型

在 Spring Security 中,为了保证用户密码的安全性,通常会对密码进行加密处理。常用的密码加密算法是 BCrypt。BCrypt 是一种基于 Blowfish 密码算法的自适应哈希算法,它会自动生成盐值并将其与密码一起进行哈希处理。

BCrypt 的数学模型可以表示为:
H a s h = B C r y p t ( p a s s w o r d , s a l t ) Hash = BCrypt(password, salt) Hash=BCrypt(password,salt)
其中,password 是用户的明文密码,salt 是自动生成的盐值,Hash 是加密后的哈希值。

以下是使用 Python 实现 BCrypt 密码加密的示例代码:

import bcrypt

# 生成盐值
salt = bcrypt.gensalt()

# 明文密码
password = "password123".encode('utf-8')

# 加密密码
hashed = bcrypt.hashpw(password, salt)

# 验证密码
if bcrypt.checkpw(password, hashed):
    print("密码验证成功")
else:
    print("密码验证失败")

4.2 令牌生成模型

在 OAuth 2.0 中,通常会使用 JWT 作为令牌。JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

JWT 的生成公式可以表示为:
J W T = B a s e 64 U r l E n c o d e ( H e a d e r ) + " . " + B a s e 64 U r l E n c o d e ( P a y l o a d ) + " . " + S i g n a t u r e JWT = Base64UrlEncode(Header) + "." + Base64UrlEncode(Payload) + "." + Signature JWT=Base64UrlEncode(Header)+"."+Base64UrlEncode(Payload)+"."+Signature
其中,Header 包含令牌的类型和使用的签名算法,Payload 包含用户的声明信息,Signature 是对头部和载荷进行签名的结果。

以下是使用 Python 实现 JWT 令牌生成和验证的示例代码:

import jwt
from datetime import datetime, timedelta

# 密钥
SECRET_KEY = "your_secret_key"

# 生成 JWT 令牌
def generate_token(user_id):
    payload = {
        "user_id": user_id,
        "exp": datetime.utcnow() + timedelta(minutes=30)
    }
    token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")
    return token

# 验证 JWT 令牌
def verify_token(token):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
        return payload
    except jwt.ExpiredSignatureError:
        print("令牌已过期")
    except jwt.InvalidTokenError:
        print("无效的令牌")
    return None

# 生成令牌
user_id = 1
token = generate_token(user_id)
print(f"生成的令牌: {token}")

# 验证令牌
result = verify_token(token)
if result:
    print(f"验证成功,用户 ID: {result['user_id']}")

5. 项目实战:代码实际案例和详细解释说明

5.1 开发环境搭建

5.1.1 项目创建

使用 Spring Initializr 创建一个新的 Spring Boot 项目,添加以下依赖:

  • Spring Web
  • Spring Security
  • Spring Data JPA
  • MySQL Driver
5.1.2 数据库配置

application.properties 中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

5.2 源代码详细实现和代码解读

5.2.1 用户实体类

创建一个 User 实体类,用于表示用户信息:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private String roles;

    // 构造函数、Getter 和 Setter 方法
    public User() {}

    public User(String username, String password, String roles) {
        this.username = username;
        this.password = password;
        this.roles = roles;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRoles() {
        return roles;
    }

    public void setRoles(String roles) {
        this.roles = roles;
    }
}
5.2.2 用户仓库接口

创建一个 UserRepository 接口,用于操作数据库中的用户信息:

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}
5.2.3 用户详细信息服务实现

创建一个 UserDetailsServiceImpl 类,实现 UserDetailsService 接口,从数据库中加载用户的详细信息:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在");
        }

        List<GrantedAuthority> authorities = new ArrayList<>();
        String[] roles = user.getRoles().split(",");
        for (String role : roles) {
            authorities.add(new SimpleGrantedAuthority("ROLE_" + role));
        }

        return new User(user.getUsername(), user.getPassword(), authorities);
    }
}
5.2.4 Spring Security 配置类

创建一个 SecurityConfig 类,继承 WebSecurityConfigurerAdapter,并配置认证和授权规则:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
           .authorizeRequests()
               .antMatchers("/public/**").permitAll()
               .antMatchers("/admin/**").hasRole("ADMIN")
               .anyRequest().authenticated()
               .and()
           .formLogin()
               .loginPage("/login")
               .permitAll()
               .and()
           .logout()
               .permitAll();
    }
}
5.2.5 控制器类

创建一个 HomeController 类,用于处理请求:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "index";
    }

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/public")
    public String publicPage() {
        return "public";
    }

    @GetMapping("/admin")
    public String adminPage() {
        return "admin";
    }
}

5.3 代码解读与分析

5.3.1 用户实体类

User 实体类使用 JPA 注解将其映射到数据库中的 user 表。id 字段作为主键,usernamepasswordroles 字段分别存储用户的用户名、密码和角色信息。

5.3.2 用户仓库接口

UserRepository 接口继承自 JpaRepository,提供了基本的数据库操作方法,如 findByUsername 方法用于根据用户名查找用户。

5.3.3 用户详细信息服务实现

UserDetailsServiceImpl 类实现了 UserDetailsService 接口,通过调用 UserRepositoryfindByUsername 方法从数据库中加载用户的详细信息,并将其封装成 UserDetails 对象返回。

5.3.4 Spring Security 配置类

SecurityConfig 类配置了 Spring Security 的认证和授权规则。passwordEncoder 方法用于创建一个 BCryptPasswordEncoder 实例,用于对密码进行加密处理。configure(AuthenticationManagerBuilder auth) 方法配置了认证管理器,使用 UserDetailsServiceImpl 加载用户信息,并使用 BCryptPasswordEncoder 验证密码。configure(HttpSecurity http) 方法配置了访问规则,允许 /public/** 路径的请求无需认证,只有具有 ROLE_ADMIN 角色的用户才能访问 /admin/** 路径的请求,其他请求需要认证。

5.3.5 控制器类

HomeController 类处理不同路径的请求,返回相应的视图页面。

6. 实际应用场景

6.1 微服务间的认证与授权

在微服务架构中,各个微服务之间需要进行通信和交互。使用 Spring Security 可以实现微服务间的认证与授权,确保只有经过授权的微服务才能访问其他微服务的资源。例如,一个用户服务可以为其他服务提供用户认证和授权信息,其他服务在调用用户服务的接口时,需要携带有效的令牌进行认证。

6.2 前后端分离应用的安全防护

在前后端分离的应用中,前端通过调用后端的 API 接口获取数据。使用 Spring Security 可以对后端 API 进行安全防护,防止未经授权的访问。例如,前端可以通过 OAuth 2.0 协议获取 JWT 令牌,然后在请求后端 API 时携带该令牌,后端使用 Spring Security 验证令牌的有效性。

6.3 多租户应用的安全隔离

在多租户应用中,不同的租户需要进行安全隔离。使用 Spring Security 可以为每个租户配置不同的认证和授权规则,确保租户之间的数据和资源相互隔离。例如,每个租户可以有自己的用户体系和角色权限,Spring Security 可以根据租户信息进行相应的认证和授权处理。

7. 工具和资源推荐

7.1 学习资源推荐

7.1.1 书籍推荐
  • 《Spring in Action》:全面介绍了 Spring 框架的核心概念和应用,包括 Spring Security 的使用。
  • 《Spring Boot实战》:详细讲解了 Spring Boot 的开发和应用,对 Spring Security 在 Spring Boot 中的使用有深入的介绍。
  • 《OAuth 2.0实战》:深入探讨了 OAuth 2.0 协议的原理和应用,对理解 Spring Security 中的 OAuth 2.0 支持有很大帮助。
7.1.2 在线课程
  • Coursera 上的 “Spring Framework 5: Beginner to Guru”:由专业讲师讲解 Spring 框架的基础知识和高级应用,包括 Spring Security。
  • Udemy 上的 “Spring Boot Microservices with Spring Cloud”:介绍了 Spring Boot 和 Spring Cloud 的相关知识,对微服务架构中的安全问题有详细的讲解。
7.1.3 技术博客和网站
  • Spring 官方文档:提供了 Spring Security 的详细文档和示例代码,是学习 Spring Security 的重要参考资料。
  • Baeldung:提供了大量关于 Spring 框架的技术文章,包括 Spring Security 的使用技巧和案例分析。
  • InfoQ:关注技术领域的最新动态和趋势,有很多关于微服务安全的文章和案例分享。

7.2 开发工具框架推荐

7.2.1 IDE和编辑器
  • IntelliJ IDEA:一款功能强大的 Java 集成开发环境,对 Spring 框架有很好的支持,提供了丰富的代码提示和调试功能。
  • Eclipse:一款开源的集成开发环境,广泛应用于 Java 开发,也可以用于开发 Spring 项目。
  • Visual Studio Code:一款轻量级的代码编辑器,支持多种编程语言,通过安装插件可以方便地进行 Spring 项目的开发。
7.2.2 调试和性能分析工具
  • Spring Boot DevTools:提供了热部署和自动重启等功能,提高了开发效率。
  • Spring Boot Actuator:提供了应用程序的监控和管理功能,如健康检查、指标监控等。
  • VisualVM:一款开源的性能分析工具,可以对 Java 应用程序进行性能监控和调优。
7.2.3 相关框架和库
  • Spring Cloud Security:基于 Spring Security 提供了微服务安全的解决方案,包括 OAuth 2.0 支持、分布式会话管理等。
  • Apache Shiro:一个强大且易用的 Java 安全框架,提供了身份验证、授权、加密等功能,可以与 Spring 框架集成使用。
  • JJWT:一个用于创建和验证 JWT 的 Java 库,方便在 Spring 项目中使用 JWT 进行身份验证和授权。

7.3 相关论文著作推荐

7.3.1 经典论文
  • “OAuth 2.0: An Overview”:介绍了 OAuth 2.0 协议的基本概念和工作流程。
  • “JSON Web Token (JWT) Profile for OAuth 2.0 Access Tokens”:详细讲解了 JWT 在 OAuth 2.0 中的应用。
7.3.2 最新研究成果
  • 关注学术期刊如 IEEE Transactions on Information Forensics and Security、ACM Transactions on Information and System Security 等,了解微服务安全领域的最新研究成果。
7.3.3 应用案例分析
  • 可以参考一些知名公司的技术博客,如 Netflix、Amazon 等,了解他们在微服务安全方面的实践经验和应用案例。

8. 总结:未来发展趋势与挑战

8.1 未来发展趋势

  • 零信任架构的应用:零信任架构强调默认不信任,始终验证。未来,Spring Security 可能会更多地集成零信任架构的理念,实现更细粒度的访问控制和安全防护。
  • 人工智能与安全的融合:利用人工智能技术对安全数据进行分析和预测,及时发现潜在的安全威胁。Spring Security 可能会与人工智能技术结合,提供更智能的安全解决方案。
  • 区块链技术的应用:区块链技术具有去中心化、不可篡改等特点,可以用于增强微服务安全架构的可信度和安全性。未来,Spring Security 可能会与区块链技术集成,实现更安全的身份认证和数据传输。

8.2 挑战

  • 复杂性管理:随着微服务架构的不断发展,系统的复杂性也在增加。如何有效地管理 Spring Security 的配置和规则,确保系统的安全性和可维护性是一个挑战。
  • 安全漏洞的防范:新的安全漏洞不断涌现,如零日漏洞等。如何及时发现和防范这些安全漏洞,确保微服务架构的安全性是一个重要的挑战。
  • 跨领域安全问题:微服务架构涉及多个领域,如网络安全、数据安全等。如何解决跨领域的安全问题,实现全方位的安全防护是一个挑战。

9. 附录:常见问题与解答

9.1 如何配置 Spring Security 支持 OAuth 2.0?

可以通过添加 Spring Security OAuth 2.0 的依赖,并在配置类中进行相应的配置。例如,配置授权服务器和资源服务器,定义客户端信息和授权规则等。

9.2 如何处理 Spring Security 中的异常?

可以通过配置异常处理机制,如自定义 AuthenticationEntryPointAccessDeniedHandler 来处理认证和授权失败的异常。

9.3 如何在 Spring Security 中实现多因素认证?

可以结合使用短信验证码、指纹识别等方式实现多因素认证。在用户认证过程中,除了验证用户名和密码外,还需要验证其他因素。

9.4 如何优化 Spring Security 的性能?

可以通过合理配置过滤器链、缓存认证信息、使用异步处理等方式优化 Spring Security 的性能。

10. 扩展阅读 & 参考资料

10.1 扩展阅读

  • 《微服务架构设计模式》:深入介绍了微服务架构的设计模式和最佳实践,对理解微服务安全架构有很大帮助。
  • 《网络安全基础教程》:系统介绍了网络安全的基础知识和常见的安全技术,有助于提高对安全问题的认识。

10.2 参考资料

  • Spring Security 官方文档:https://spring.io/projects/spring-security
  • OAuth 2.0 官方文档:https://oauth.net/2/
  • JWT 官方文档:https://jwt.io/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值