Java auth0api+;Spring:如何从成功的Auth0 API响应中验证用户身份 问题
我正在尝试创建一个应用程序,它在前端使用Auth0 SPA+React对用户进行身份验证,而无需处理密码。然后,我想保护我使用Auth服务器创建的任何端点,我需要使用Spring框架创建该服务器 只是澄清一下,流程将是Java auth0api+;Spring:如何从成功的Auth0 API响应中验证用户身份 问题,java,spring,spring-boot,jwt,auth0,Java,Spring,Spring Boot,Jwt,Auth0,我正在尝试创建一个应用程序,它在前端使用Auth0 SPA+React对用户进行身份验证,而无需处理密码。然后,我想保护我使用Auth服务器创建的任何端点,我需要使用Spring框架创建该服务器 只是澄清一下,流程将是 Frontend -> Auth through Auth0 -> Redirect to users dashboard on frontend -> Make HTTP request to endpoint sending JWT returned fro
Frontend ->
Auth through Auth0 ->
Redirect to users dashboard on frontend ->
Make HTTP request to endpoint sending JWT returned from Auth0 ->
Endpoint makes request to my Auth Server sending JWT returned from Auth0 ->
Auth server either either returns 401 or user object based on JWT ->
Endpoint grabs data specific to that user from DB ->
Returns data to frontend
使用Auth0提供的Quickstart Guide我成功地让我的前端正常工作,但我在弄清楚如何使用我的Auth服务来验证用户时遇到了很多麻烦
我相信我已经得出结论,我需要在Auth0上创建一个“API,并获取一个访问令牌,并使用它来验证JWT,在这种情况下,JWT只是访问令牌,而不是我的前端包含的JWT。我也让这部分工作,但似乎没有办法知道谁是用户。当测试此“API”时,在发送有效请求后,我返回
{
"iss": "https://${username}.auth0.com/",
"sub": "${alphanumericCharacters}@clients",
"aud": "${ApiIdentifier}",
"iat": ${issuedAt},
"exp": ${expiresAt},
"azp": "${alphanumericCharacters}",
"gty": "client-credentials"
}
虽然很高兴知道我在正确的轨道上,但我似乎不知道如何处理这个响应来找到用户
预期
我希望在通过我的身份验证服务验证访问\u令牌后能够识别特定用户
代码
我没有太多的代码要显示,但我将通过我的身份验证服务提供我所能提供的
SecurityConfiguration.java
@EnableWebSecurity
公共类安全配置扩展了WebSecurity配置适配器{
@值(${auth0.accession}”)
私人弦乐观众;
@值(${spring.security.oauth2.resourceserver.jwt.issuer uri}”)
私人字符串发行人;
@凌驾
public void configure(HttpSecurity-HttpSecurity)引发异常{
httpSecurity.authorizeRequests()
.mvcMatchers(“/api/validate”)
.authenticated()
.及()
.oauth2ResourceServer()
.jwt();
}
@豆子
JwtDecoder JwtDecoder(){
NimbusJwtDecoderJwkSupport jwtDecoder=(NimbusJwtDecoderJwkSupport)
JwtDecoders.fromOidcIssuerLocation(发行人);
OAuth2TokenValidator audienceValidator=新的audienceValidator(观众);
OAuth2TokenValidator with issuer=JwtValidators.createDefaultWithIssuer(issuer);
OAuth2TokenValidator with audition=新授权授权人2 TokenValidator(with发卡机构、audienceValidator);
jwtDecoder.setJwtValidator(带观众);
返回jwt解码器;
}
}
AudienceValidator.java
公共类AudienceValidator实现OAuth2TokenValidator{
私人终场观众;
公众听众(弦乐观众){
这个。观众=观众;
}
公共OAuth2TokenValidatorResult验证(Jwt Jwt){
OAuth2Error error=新的OAuth2Error(“无效的_令牌”,“缺少所需的访问群体”,null);
if(jwt.getAudience().contains(观众)){
返回OAuth2TokenValidatorResult.success();
}
返回OAuth2TokenValidatorResult.failure(错误);
}
}
ValidateControl.java
@RestController
@请求映射(“/api/validate”)
公共类ValidateControl{
@GetMapping
公共布尔验证(){
return true;//仅在成功身份验证时返回
}
}
看完文档后,我找到了解决方案
事实证明,我不需要在Auth0上创建一个“API”,而是需要使用Auth0中的应用程序Auth0基于您的帐户提供许多端点,您可以从任何应用程序(CLI、服务器、客户端等)利用这些端点,只要您能够:
- 发出HTTP请求
- 提供凭证
- 在前端使用,您可以在成功身份验证后使用获取用户访问令牌
- 向您的Rest服务发送HTTP请求
- Rest服务将该令牌发送到您的身份验证服务
- Auth服务向
带有https://myAuth0Username.auth0.com/userinfo
头授权:承载${access\u token}
- 如果从Auth0成功进行了身份验证
- 返回用户信息,如“姓名”、“电子邮件”等
- 否则
- 返回403禁止的HTTP状态
- 验证服务然后将用户对象返回到Rest服务
- Rest服务然后为该端点执行必要的逻辑(DB查询、另一个HTTP请求等)
x.SpringTodo_Auth.Controllers包;
导入x.SpringTodo_Auth.Models.User;
导入org.springframework.http.HttpEntity;
导入org.springframework.http.HttpHeaders;
导入org.springframework.http.HttpMethod;
导入org.springframework.web.bind.annotation.GetMapping;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RestController;
导入org.springframework.web.client.rest模板;
@RestController
@请求映射(“/api/validate”)
公共类ValidateControl{
@GetMapping
公共对象验证(){
//在发送HTTP请求之前创建并设置“授权”头
HttpHeaders=新的HttpHeaders();
headers.set(“作者