Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java auth0api+;Spring:如何从成功的Auth0 API响应中验证用户身份 问题_Java_Spring_Spring Boot_Jwt_Auth0 - Fatal编程技术网

Java auth0api+;Spring:如何从成功的Auth0 API响应中验证用户身份 问题

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

我正在尝试创建一个应用程序,它在前端使用Auth0 SPA+React对用户进行身份验证,而无需处理密码。然后,我想保护我使用Auth服务器创建的任何端点,我需要使用Spring框架创建该服务器

只是澄清一下,流程将是

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请求
  • 提供凭证
因此,获取用户信息的方法是

数据流 使用my projects auth/data flow,它几乎是:

  • 在前端使用,您可以在成功身份验证后使用获取用户访问令牌

  • 向您的Rest服务发送HTTP请求

  • Rest服务将该令牌发送到您的身份验证服务

  • Auth服务
    https://myAuth0Username.auth0.com/userinfo
    带有
    授权:承载${access\u token}

  • 如果从Auth0成功进行了身份验证

    • 返回用户信息,如“姓名”、“电子邮件”等
  • 否则

    • 返回403禁止的HTTP状态
  • 验证服务然后将用户对象返回到Rest服务

  • Rest服务然后为该端点执行必要的逻辑(DB查询、另一个HTTP请求等)

验证服务端点以验证令牌并返回用户的示例 validateControl.java

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(“作者