Auth0 Spring Boot API 集成
使用 com.auth0:auth0-springboot-api 保护 Spring Boot API 端点,实现 JWT 访问令牌验证。支持自动配置、基于作用域的授权和内置 DPoP(RFC 9449)支持。
代理指令:在提供 SDK 设置说明之前,通过运行以下命令获取最新的发布版本:
gh api repos/auth0/auth0-auth-java/releases/latest --jq '.tag_name'
在所有依赖项行中使用返回的版本号,而不是任何硬编码版本。如果 API 调用失败(例如,尚无发布版本),则使用 1.0.0-beta.1。
前提条件
Java 17+ 和 Spring Boot 3.2+
Maven 3.6+ 或 Gradle 7+
配置了 Auth0 API(不是应用程序 —— 必须是 API 资源)
如果您尚未设置 Auth0,请先使用 auth0-quickstart 技能
何时不使用
用例 推荐技能
服务器渲染的 Web 应用程序(Spring MVC 与会话) 使用 auth0-java 进行 Spring Boot Web 应用程序的登录 UI
单页应用程序 使用 auth0-react、auth0-vue 或 auth0-angular 进行客户端身份验证
移动应用程序 使用 auth0-android 或 auth0-swift 进行本机移动
非 Spring Java API 使用 auth0-spring-security-api 进行普通 Spring Security
快速入门工作流
代理指令:如果用户的提示已经提供了 Auth0 凭据(域、受众),则直接使用它们 —— 跳过引导脚本和凭据问题。仅在凭据缺失时提供设置选项。
Gradle(build.gradle):
implementation 'com.auth0:auth0-springboot-api:1.0.0-beta.1'
Maven(pom.xml):
com.auth0
auth0-springboot-api
1.0.0-beta.1
您需要在 Auth0 中创建一个 API(不是应用程序)。
停止 —— 在继续之前询问用户。
询问用户以下问题,并等待他们的回答:
“您想如何创建 Auth0 API 资源?
自动 —— 我将运行 Auth0 CLI 脚本来创建资源并将值写入 application.yml。
手动 —— 您自己在 Auth0 Dashboard(或通过 auth0 apis create)中创建 API 并提供域和受众。
您更喜欢哪一个?(1 = 自动 / 2 = 手动)”
在用户回答之前,请勿继续任何设置步骤。
请勿默认为手动。
如果用户选择自动,请按照设置指南完成 CLI 脚本。
自动路径将为您编写 application.yml —— 跳过下面的步骤 3 并直接转到步骤 4。
如果用户选择手动,请按照设置指南(手动设置部分)进行操作。
然后继续执行步骤 3。
手动 API 创建的快速参考:
# 使用 Auth0 CLI
auth0 apis create \
--name "My Spring Boot API" \
--identifier https://my-springboot-api
或者在 Auth0 Dashboard → Applications → APIs 中手动创建
auth0:
域: "your-tenant.auth0.com"
受众: "https://my-springboot-api"
重要:域不得包含 https://。
库会自动构造颁发者 URL。
或者使用 application.properties:
auth0.domain=your-tenant.auth0.com
auth0.audience=https://my-springboot-api
@Configuration
@EnableMethodSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain apiSecurity(
HttpSecurity http,
Auth0AuthenticationFilter authFilter
) throws Exception {
return http
.csrf(csrf -> csrf.disable())
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public").permitAll()
.requestMatchers("/api/protected").authenticated()
.requestMatchers("/api/admin/**").hasAuthority("SCOPE_admin")
.anyRequest().authenticated())
.addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
}
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/public")
public ResponseEntity> publicEndpoint() {
return ResponseEntity.ok(Map.of("message", "Public endpoint - no token required"));
}
@GetMapping("/protected")
public ResponseEntity> protectedEndpoint(Authentication authentication) {
Auth0AuthenticationToken token = (Auth0AuthenticationToken) authentication;
return ResponseEntity.ok(Map.of(
"user", authentication.getName(),
"email", token.getClaim("email"),
"scopes", token.getScopes()
));
}
}
代理指令:编写所有代码后,验证构建是否成功:
./gradlew bootRun 或 ./mvnw spring-boot:run。
如果构建失败,请诊断和修复。
在 5-6 次失败的尝试后,使用 AskUserQuestion 获取帮助。
测试公共端点:
curl http://localhost:8080/api/public
测试受保护端点(需要访问令牌):
curl http://localhost:8080/api/protected -H "Authorization: Bearer YOUR_ACCESS_TOKEN"