OAuth 2.0 和 JWT 授权在 Kotlin 中的实践

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin 中的 OAuth 2.0 和 JWT 简介



现代 Web 应用程序和 API 需要可靠的认证和授权机制。两个关键标准——OAuth 2.0(委托访问协议)和 JWT(JSON Web Token,一种紧凑的令牌格式)——通常一起使用来构建安全系统。Kotlin 凭借其与 Java 的兼容性和简洁的语法,非常适合实现这些协议。



在本文中,我们将探讨如何在 Kotlin 中实际实现 OAuth 2.0 和 JWT 授权。您将学习如何配置令牌颁发服务器、创建受保护的端点以及处理各种授权类型(grant types),例如授权码(Authorization Code)和客户端凭证(Client Credentials)。



基础知识:OAuth 2.0 和 JWT



什么是 OAuth 2.0?

OAuth 2.0 是一种协议,允许第三方应用程序在无需传递用户名和密码的情况下,获得对用户资源的有限访问权限。主要参与者:

  • 资源所有者(Resource Owner)——通常是用户。
  • 客户端(Client)——请求访问的应用程序。
  • 授权服务器(Authorization Server)——颁发令牌。
  • 资源服务器(Resource Server)——存储受保护的数据。


什么是 JWT?

JWT 是一种紧凑的、URL 安全的令牌,由三部分组成(header、payload、signature),用点分隔。它用于在各方之间传递声明(claims)。JWT 的优势:

  • 无需在服务器上存储会话(无状态)。
  • 包含所有必要信息(例如用户 ID、角色)。
  • 使用数字签名,保证其完整性。


在 Kotlin(Spring Boot)中实现 OAuth 2.0 与 JWT



让我们来看一个使用 Spring Boot 和 Spring Security 库的实际示例。我们将创建一个简单的授权服务器和一个受保护的资源。



步骤 1:配置依赖项

在 build.gradle.kts 中添加必要的依赖项:

dependencies {    implementation("org.springframework.boot:spring-boot-starter-web")    implementation("org.springframework.boot:spring-boot-starter-security")    implementation("org.springframework.security:spring-security-oauth2-authorization-server")    implementation("io.jsonwebtoken:jjwt-api:0.12.3")    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")}


步骤 2:配置授权服务器

创建一个用于 OAuth 2.0 的配置类:

import org.springframework.context.annotation.Beanimport org.springframework.context.annotation.Configurationimport org.springframework.security.config.annotation.web.builders.HttpSecurityimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurityimport org.springframework.security.core.userdetails.Userimport org.springframework.security.core.userdetails.UserDetailsServiceimport org.springframework.security.oauth2.core.AuthorizationGrantTypeimport org.springframework.security.oauth2.core.ClientAuthenticationMethodimport org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepositoryimport org.springframework.security.oauth2.server.authorization.client.RegisteredClientimport org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepositoryimport org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfigurationimport org.springframework.security.provisioning.InMemoryUserDetailsManagerimport org.springframework.security.web.SecurityFilterChainimport java.util.UUID

@Configuration@EnableWebSecurityclass SecurityConfig {

@Bean

博客

书籍推荐