AzureUserInfo.java

  1. package no.nav.data.common.security.azure;

  2. import com.nimbusds.jwt.JWTClaimsSet;
  3. import lombok.Value;
  4. import no.nav.data.common.security.AppIdMapping;
  5. import no.nav.data.common.security.dto.AppRole;
  6. import no.nav.data.common.security.dto.UserInfo;
  7. import no.nav.data.common.security.dto.UserInfoResponse;
  8. import org.springframework.security.core.GrantedAuthority;
  9. import org.springframework.security.oauth2.core.oidc.StandardClaimNames;

  10. import java.util.List;
  11. import java.util.Set;

  12. import static no.nav.data.common.security.azure.AzureConstants.APPID_CLAIM;
  13. import static no.nav.data.common.security.azure.AzureConstants.APPID_CLAIM_V2;
  14. import static no.nav.data.common.security.azure.AzureConstants.USER_ID_CLAIM;
  15. import static no.nav.data.common.security.azure.AzureConstants.VER_CLAIM;
  16. import static no.nav.data.common.security.dto.AppRole.ROLE_PREFIX;
  17. import static no.nav.data.common.utils.StreamUtils.convert;
  18. import static no.nav.data.common.utils.StreamUtils.copyOf;
  19. import static org.apache.commons.lang3.StringUtils.substringAfter;

  20. @Value
  21. public class AzureUserInfo implements UserInfo {

  22.     String appId;
  23.     String userId;
  24.     String ident;
  25.     String name;
  26.     String email;
  27.     List<String> groups;

  28.     public AzureUserInfo(JWTClaimsSet jwtClaimsSet, Set<GrantedAuthority> grantedAuthorities) {
  29.         this.appId = getAppId(jwtClaimsSet);
  30.         this.ident = getClaim(jwtClaimsSet, AzureConstants.IDENT_CLAIM);
  31.         this.userId = getUserId(jwtClaimsSet);

  32.         this.name = getClaim(jwtClaimsSet, StandardClaimNames.NAME);
  33.         this.email = getEmail(jwtClaimsSet);
  34.         groups = convert(grantedAuthorities, grantedAuthority -> substringAfter(grantedAuthority.getAuthority(), ROLE_PREFIX));
  35.     }

  36.     public static String getAppId(JWTClaimsSet jwtClaimsSet) {
  37.         if (isV1(jwtClaimsSet)) {
  38.             return (String) jwtClaimsSet.getClaim(APPID_CLAIM);
  39.         }
  40.         return (String) jwtClaimsSet.getClaim(APPID_CLAIM_V2);
  41.     }

  42.     public static String getUserId(JWTClaimsSet jwtClaimsSet) {
  43.         return (String) jwtClaimsSet.getClaim(USER_ID_CLAIM);
  44.     }

  45.     private String getEmail(JWTClaimsSet jwtClaimsSet) {
  46.         if (isV1(jwtClaimsSet)) {
  47.             return getClaim(jwtClaimsSet, "unique_name");
  48.         }
  49.         return (String) jwtClaimsSet.getClaim(StandardClaimNames.PREFERRED_USERNAME);
  50.     }

  51.     private static boolean isV1(JWTClaimsSet jwtClaimsSet) {
  52.         return "1.0".equals(getClaim(jwtClaimsSet, VER_CLAIM));
  53.     }

  54.     public String getIdentName() {
  55.         return String.format("%s - %s", ident, name);
  56.     }

  57.     public String getAppName() {
  58.         return AppIdMapping.getAppNameForAppId(appId);
  59.     }

  60.     @SuppressWarnings("unchecked")
  61.     private static <T> T getClaim(JWTClaimsSet jwtClaimsSet, String claim) {
  62.         return (T) jwtClaimsSet.getClaim(claim);
  63.     }

  64.     @Override
  65.     public boolean isAdmin() {
  66.         return groups.contains(AppRole.ADMIN.name());
  67.     }

  68.     public UserInfoResponse convertToResponse() {
  69.         return UserInfoResponse.builder()
  70.                 .loggedIn(true)
  71.                 .ident(ident)
  72.                 .name(name)
  73.                 .email(email)
  74.                 .groups(copyOf(groups))
  75.                 .build();
  76.     }
  77. }