AzureUserInfo.java

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

import com.nimbusds.jwt.JWTClaimsSet;
import lombok.Value;
import no.nav.data.common.security.AppIdMapping;
import no.nav.data.common.security.dto.AppRole;
import no.nav.data.common.security.dto.UserInfo;
import no.nav.data.common.security.dto.UserInfoResponse;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.core.oidc.StandardClaimNames;

import java.util.List;
import java.util.Set;

import static no.nav.data.common.security.azure.AzureConstants.APPID_CLAIM;
import static no.nav.data.common.security.azure.AzureConstants.APPID_CLAIM_V2;
import static no.nav.data.common.security.azure.AzureConstants.USER_ID_CLAIM;
import static no.nav.data.common.security.azure.AzureConstants.VER_CLAIM;
import static no.nav.data.common.security.dto.AppRole.ROLE_PREFIX;
import static no.nav.data.common.utils.StreamUtils.convert;
import static no.nav.data.common.utils.StreamUtils.copyOf;
import static org.apache.commons.lang3.StringUtils.substringAfter;

@Value
public class AzureUserInfo implements UserInfo {

    String appId;
    String userId;
    String ident;
    String name;
    String email;
    List<String> groups;

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

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

    public static String getAppId(JWTClaimsSet jwtClaimsSet) {
        if (isV1(jwtClaimsSet)) {
            return (String) jwtClaimsSet.getClaim(APPID_CLAIM);
        }
        return (String) jwtClaimsSet.getClaim(APPID_CLAIM_V2);
    }

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

    private String getEmail(JWTClaimsSet jwtClaimsSet) {
        if (isV1(jwtClaimsSet)) {
            return getClaim(jwtClaimsSet, "unique_name");
        }
        return (String) jwtClaimsSet.getClaim(StandardClaimNames.PREFERRED_USERNAME);
    }

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

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

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

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

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

    public UserInfoResponse convertToResponse() {
        return UserInfoResponse.builder()
                .loggedIn(true)
                .ident(ident)
                .name(name)
                .email(email)
                .groups(copyOf(groups))
                .build();
    }
}