AzureJwtBearerTokenAuthenticationConverter.java
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.spring.aad.webapi;
import java.util.Collection;
import org.springframework.core.convert.converter.Converter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.core.OAuth2AccessToken;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthentication;
import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
import org.springframework.util.Assert;
/**
* A {@link Converter} that takes a {@link Jwt} and converts it into a {@link BearerTokenAuthentication}.
*/
public class AzureJwtBearerTokenAuthenticationConverter implements Converter<Jwt, AbstractAuthenticationToken> {
private static final String DEFAULT_AUTHORITY_PREFIX = "SCOPE_";
private Converter<Jwt, Collection<GrantedAuthority>> jwtGrantedConverter
= new JwtGrantedAuthoritiesConverter();
public AzureJwtBearerTokenAuthenticationConverter() {
}
public AzureJwtBearerTokenAuthenticationConverter(String authoritiesClaimName) {
this(authoritiesClaimName, DEFAULT_AUTHORITY_PREFIX);
}
public AzureJwtBearerTokenAuthenticationConverter(String authoritiesClaimName, String authorityPrefix) {
Assert.notNull(authoritiesClaimName, "authoritiesClaimName cannot be null");
Assert.notNull(authorityPrefix, "authorityPrefix cannot be null");
JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName(authoritiesClaimName);
jwtGrantedAuthoritiesConverter.setAuthorityPrefix(authorityPrefix);
this.jwtGrantedConverter = jwtGrantedAuthoritiesConverter;
}
protected Collection<GrantedAuthority> extractAuthorities(Jwt jwt) {
return this.jwtGrantedConverter.convert(jwt);
}
@Override
public AbstractAuthenticationToken convert(Jwt jwt) {
OAuth2AccessToken accessToken = new OAuth2AccessToken(
OAuth2AccessToken.TokenType.BEARER, jwt.getTokenValue(), jwt.getIssuedAt(), jwt.getExpiresAt());
Collection<GrantedAuthority> authorities = extractAuthorities(jwt);
AzureOAuth2AuthenticatedPrincipal principal = new AzureOAuth2AuthenticatedPrincipal(
jwt.getHeaders(), jwt.getClaims(), authorities, jwt.getTokenValue());
return new BearerTokenAuthentication(principal, accessToken, authorities);
}
public void setJwtGrantedAuthoritiesConverter(
Converter<Jwt, Collection<GrantedAuthority>> jwtGrantedAuthoritiesConverter) {
this.jwtGrantedConverter = jwtGrantedAuthoritiesConverter;
}
}