Проблема
Я пытаюсь создать приложение, которое использует Auth0 SPA + React на веб-интерфейсе для аутентификации пользователей без необходимости иметь дело с паролями.Затем я хотел бы защитить любые конечные точки, которые я создаю, используя сервер Auth , который требуется создать с помощью Spring Framework .
Просто чтобы уточнить,поток будет
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 предоставляет, но у меня естьочень трудно понять, как заставить мою службу аутентификации проверить пользователя.
Я считаю, что пришел к выводу, что мне нужно создать " API"на Auth0 и захватите токен доступа и используйте его для проверки JWT, который в данном случае является просто токеном доступа , а не JWT, который мойфронтенд содержит.У меня также есть эта часть работы, но, кажется, нет способа узнать, кто пользователь.При тестировании этого API , после отправки действительного запроса мне возвращается
{
"iss": "https://${username}.auth0.com/",
"sub": "${alphanumericCharacters}@clients",
"aud": "${ApiIdentifier}",
"iat": ${issuedAt},
"exp": ${expiresAt},
"azp": "${alphanumericCharacters}",
"gty": "client-credentials"
}
Хотя приятно знать, что я на правильном пути, кажется, я не могу понять,что делать с этим ответом, чтобы найти пользователя.
Ожидается
Я ожидаю, что смогу идентифицировать конкретного пользователя после проверки access_token из моего AuthСлужба
Код
У меня не так много кода, чтобы показать, но я предоставлю то, что я могу из моей службы Auth
SecurityConfiguration.java
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Value("${auth0.audience}")
private String audience;
@Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
private String issuer;
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.authorizeRequests()
.mvcMatchers("/api/validate")
.authenticated()
.and()
.oauth2ResourceServer()
.jwt();
}
@Bean
JwtDecoder jwtDecoder() {
NimbusJwtDecoderJwkSupport jwtDecoder = (NimbusJwtDecoderJwkSupport)
JwtDecoders.fromOidcIssuerLocation(issuer);
OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(audience);
OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer(issuer);
OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(withIssuer, audienceValidator);
jwtDecoder.setJwtValidator(withAudience);
return jwtDecoder;
}
}
AudienceValidator.java
public class AudienceValidator implements OAuth2TokenValidator<Jwt> {
private final String audience;
public AudienceValidator(String audience) {
this.audience = audience;
}
public OAuth2TokenValidatorResult validate(Jwt jwt) {
OAuth2Error error = new OAuth2Error("invalid_token", "The required audience is missing", null);
if (jwt.getAudience().contains(audience)) {
return OAuth2TokenValidatorResult.success();
}
return OAuth2TokenValidatorResult.failure(error);
}
}
ValidateController.java
@RestController
@RequestMapping("/api/validate")
public class ValidateController {
@GetMapping
public boolean validate() {
return true; // only returns if successfully authed
}
}