Search in sources :

Example 1 with IDTokenValidationFailureException

use of org.wso2.carbon.identity.oauth2.IDTokenValidationFailureException in project identity-inbound-auth-oauth by wso2-extensions.

the class DefaultIDTokenBuilder method buildIDToken.

@Override
public String buildIDToken(OAuthTokenReqMessageContext tokenReqMsgCtxt, OAuth2AccessTokenRespDTO tokenRespDTO) throws IdentityOAuth2Exception {
    String clientId = tokenReqMsgCtxt.getOauth2AccessTokenReqDTO().getClientId();
    String spTenantDomain = getSpTenantDomain(tokenReqMsgCtxt);
    String idTokenIssuer = OAuth2Util.getIdTokenIssuer(spTenantDomain);
    String accessToken = tokenRespDTO.getAccessToken();
    // Initialize OAuthAppDO using the client ID.
    OAuthAppDO oAuthAppDO;
    try {
        oAuthAppDO = OAuth2Util.getAppInformationByClientId(clientId);
    } catch (InvalidOAuthClientException e) {
        String error = "Error occurred while getting app information for client_id: " + clientId;
        throw new IdentityOAuth2Exception(error, e);
    }
    long idTokenValidityInMillis = getIDTokenExpiryInMillis(oAuthAppDO);
    long currentTimeInMillis = Calendar.getInstance().getTimeInMillis();
    AuthenticatedUser authorizedUser = tokenReqMsgCtxt.getAuthorizedUser();
    String subjectClaim = getSubjectClaim(tokenReqMsgCtxt, tokenRespDTO, clientId, spTenantDomain, authorizedUser);
    String nonceValue = null;
    String idpSessionKey = null;
    long authTime = 0;
    String acrValue = null;
    List<String> amrValues = Collections.emptyList();
    // AuthorizationCode only available for authorization code grant type
    if (getAuthorizationCode(tokenReqMsgCtxt) != null) {
        AuthorizationGrantCacheEntry authzGrantCacheEntry = getAuthorizationGrantCacheEntryFromCode(getAuthorizationCode(tokenReqMsgCtxt));
        if (authzGrantCacheEntry != null) {
            nonceValue = authzGrantCacheEntry.getNonceValue();
            acrValue = authzGrantCacheEntry.getSelectedAcrValue();
            if (isAuthTimeRequired(authzGrantCacheEntry)) {
                authTime = authzGrantCacheEntry.getAuthTime();
            }
            amrValues = authzGrantCacheEntry.getAmrList();
            idpSessionKey = getIdpSessionKey(authzGrantCacheEntry);
        }
    } else {
        amrValues = tokenReqMsgCtxt.getOauth2AccessTokenReqDTO().getAuthenticationMethodReferences();
        if (OAuthConstants.GrantTypes.REFRESH_TOKEN.equalsIgnoreCase(tokenReqMsgCtxt.getOauth2AccessTokenReqDTO().getGrantType())) {
            AuthorizationGrantCacheEntry authorizationGrantCacheEntryFromToken = getAuthorizationGrantCacheEntryFromToken(tokenRespDTO.getAccessToken());
            if (authorizationGrantCacheEntryFromToken != null) {
                if (isAuthTimeRequired(authorizationGrantCacheEntryFromToken)) {
                    authTime = authorizationGrantCacheEntryFromToken.getAuthTime();
                }
            }
        }
        idpSessionKey = getIdpSessionKey(accessToken);
    }
    if (log.isDebugEnabled()) {
        log.debug(buildDebugMessage(idTokenIssuer, subjectClaim, nonceValue, idTokenValidityInMillis, currentTimeInMillis));
    }
    List<String> audience = OAuth2Util.getOIDCAudience(clientId, oAuthAppDO);
    JWTClaimsSet.Builder jwtClaimsSetBuilder = new JWTClaimsSet.Builder();
    jwtClaimsSetBuilder.issuer(idTokenIssuer);
    jwtClaimsSetBuilder.audience(audience);
    jwtClaimsSetBuilder.claim(AZP, clientId);
    jwtClaimsSetBuilder.expirationTime(getIdTokenExpiryInMillis(idTokenValidityInMillis, currentTimeInMillis));
    jwtClaimsSetBuilder.issueTime(new Date(currentTimeInMillis));
    jwtClaimsSetBuilder.notBeforeTime(new Date(currentTimeInMillis));
    if (authTime != 0) {
        jwtClaimsSetBuilder.claim(AUTH_TIME, authTime / 1000);
    }
    if (nonceValue != null) {
        jwtClaimsSetBuilder.claim(NONCE, nonceValue);
    }
    if (StringUtils.isNotEmpty(acrValue)) {
        jwtClaimsSetBuilder.claim(OAuthConstants.ACR, acrValue);
    }
    if (amrValues != null) {
        jwtClaimsSetBuilder.claim(OAuthConstants.AMR, translateAmrToResponse(amrValues));
    }
    if (idpSessionKey != null) {
        jwtClaimsSetBuilder.claim(IDP_SESSION_KEY, idpSessionKey);
    }
    setUserRealm(authorizedUser, jwtClaimsSetBuilder);
    setAdditionalClaims(tokenReqMsgCtxt, tokenRespDTO, jwtClaimsSetBuilder);
    tokenReqMsgCtxt.addProperty(OAuthConstants.ACCESS_TOKEN, accessToken);
    tokenReqMsgCtxt.addProperty(MultitenantConstants.TENANT_DOMAIN, getSpTenantDomain(tokenReqMsgCtxt));
    jwtClaimsSetBuilder.subject(subjectClaim);
    JWTClaimsSet jwtClaimsSet = handleOIDCCustomClaims(tokenReqMsgCtxt, jwtClaimsSetBuilder);
    if (isInvalidToken(jwtClaimsSet)) {
        throw new IDTokenValidationFailureException("Error while validating ID Token token for required claims");
    }
    if (isUnsignedIDToken()) {
        return new PlainJWT(jwtClaimsSet).serialize();
    }
    return getIDToken(clientId, spTenantDomain, jwtClaimsSet, oAuthAppDO, getSigningTenantDomain(tokenReqMsgCtxt));
}
Also used : PlainJWT(com.nimbusds.jwt.PlainJWT) AuthenticatedUser(org.wso2.carbon.identity.application.authentication.framework.model.AuthenticatedUser) Date(java.util.Date) OAuthAppDO(org.wso2.carbon.identity.oauth.dao.OAuthAppDO) AuthorizationGrantCacheEntry(org.wso2.carbon.identity.oauth.cache.AuthorizationGrantCacheEntry) IdentityOAuth2Exception(org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception) JWTClaimsSet(com.nimbusds.jwt.JWTClaimsSet) IDTokenValidationFailureException(org.wso2.carbon.identity.oauth2.IDTokenValidationFailureException) InvalidOAuthClientException(org.wso2.carbon.identity.oauth.common.exception.InvalidOAuthClientException)

Example 2 with IDTokenValidationFailureException

use of org.wso2.carbon.identity.oauth2.IDTokenValidationFailureException in project identity-inbound-auth-oauth by wso2-extensions.

the class AccessTokenIssuerTest method getMockIDTokenBuilderForFailure.

private IDTokenBuilder getMockIDTokenBuilderForFailure() throws IdentityOAuth2Exception {
    IDTokenBuilder idTokenBuilder = mock(IDTokenBuilder.class);
    when(idTokenBuilder.buildIDToken(any(OAuthTokenReqMessageContext.class), any(OAuth2AccessTokenRespDTO.class))).thenThrow(new IDTokenValidationFailureException("ID Token Validation failed"));
    return idTokenBuilder;
}
Also used : IDTokenBuilder(org.wso2.carbon.identity.openidconnect.IDTokenBuilder) OAuth2AccessTokenRespDTO(org.wso2.carbon.identity.oauth2.dto.OAuth2AccessTokenRespDTO) IDTokenValidationFailureException(org.wso2.carbon.identity.oauth2.IDTokenValidationFailureException)

Example 3 with IDTokenValidationFailureException

use of org.wso2.carbon.identity.oauth2.IDTokenValidationFailureException in project identity-inbound-auth-oauth by wso2-extensions.

the class AccessTokenIssuer method issue.

/**
 * Issue access token using the respective grant handler and client authentication handler.
 *
 * @param tokenReqDTO
 * @return access token response
 * @throws IdentityException
 * @throws InvalidOAuthClientException
 */
public OAuth2AccessTokenRespDTO issue(OAuth2AccessTokenReqDTO tokenReqDTO) throws IdentityException {
    String grantType = tokenReqDTO.getGrantType();
    OAuth2AccessTokenRespDTO tokenRespDTO = null;
    AuthorizationGrantHandler authzGrantHandler = authzGrantHandlers.get(grantType);
    OAuthTokenReqMessageContext tokReqMsgCtx = new OAuthTokenReqMessageContext(tokenReqDTO);
    boolean isRefreshRequest = GrantType.REFRESH_TOKEN.toString().equals(grantType);
    triggerPreListeners(tokenReqDTO, tokReqMsgCtx, isRefreshRequest);
    OAuthClientAuthnContext oAuthClientAuthnContext = tokenReqDTO.getoAuthClientAuthnContext();
    if (oAuthClientAuthnContext == null) {
        if (LoggerUtils.isDiagnosticLogsEnabled()) {
            Map<String, Object> params = new HashMap<>();
            params.put("clientId", tokenReqDTO.getClientId());
            if (StringUtils.isNotBlank(tokenReqDTO.getClientSecret())) {
                params.put("clientSecret", tokenReqDTO.getClientSecret().replaceAll(".", "*"));
            }
            LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.FAILED, "OAuth client authentication failed.", "issue-access-token", null);
        }
        oAuthClientAuthnContext = new OAuthClientAuthnContext();
        oAuthClientAuthnContext.setAuthenticated(false);
        oAuthClientAuthnContext.setErrorMessage("Client Authentication Failed");
        oAuthClientAuthnContext.setErrorCode(OAuthError.TokenResponse.INVALID_REQUEST);
    }
    // whether the grant type is confidential or not.
    if (oAuthClientAuthnContext.isMultipleAuthenticatorsEngaged()) {
        if (LoggerUtils.isDiagnosticLogsEnabled()) {
            Map<String, Object> params = new HashMap<>();
            params.put("clientId", tokenReqDTO.getClientId());
            params.put("clientAuthenticators", oAuthClientAuthnContext.getExecutedAuthenticators());
            LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.FAILED, "The client MUST NOT use more than one authentication method per request.", "issue-access-token", null);
        }
        tokenRespDTO = handleError(OAuth2ErrorCodes.INVALID_REQUEST, "The client MUST NOT use more than one " + "authentication method in each", tokenReqDTO);
        setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        return tokenRespDTO;
    }
    boolean isAuthenticated = oAuthClientAuthnContext.isAuthenticated();
    if (authzGrantHandler == null) {
        String errorMsg = "Unsupported grant type : " + grantType + ", is used.";
        if (log.isDebugEnabled()) {
            log.debug(errorMsg);
        }
        if (LoggerUtils.isDiagnosticLogsEnabled()) {
            Map<String, Object> params = new HashMap<>();
            params.put("clientId", tokenReqDTO.getClientId());
            params.put("grantType", grantType);
            LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.FAILED, "Unsupported grant type.", "issue-access-token", null);
        }
        tokenRespDTO = handleError(OAuthError.TokenResponse.UNSUPPORTED_GRANT_TYPE, errorMsg, tokenReqDTO);
        setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        return tokenRespDTO;
    }
    // If the client is not confidential then there is no need to authenticate the client.
    if (!authzGrantHandler.isConfidentialClient() && StringUtils.isNotEmpty(oAuthClientAuthnContext.getClientId())) {
        isAuthenticated = true;
    }
    if (!isAuthenticated && !oAuthClientAuthnContext.isPreviousAuthenticatorEngaged() && authzGrantHandler.isConfidentialClient()) {
        if (LoggerUtils.isDiagnosticLogsEnabled()) {
            Map<String, Object> params = new HashMap<>();
            params.put("clientId", tokenReqDTO.getClientId());
            LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.FAILED, "Unsupported client authentication method.", "issue-access-token", null);
        }
        tokenRespDTO = handleError(OAuth2ErrorCodes.INVALID_CLIENT, "Unsupported Client Authentication Method!", tokenReqDTO);
        setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        return tokenRespDTO;
    }
    if (!isAuthenticated) {
        if (LoggerUtils.isDiagnosticLogsEnabled()) {
            Map<String, Object> params = new HashMap<>();
            params.put("clientId", tokenReqDTO.getClientId());
            LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.FAILED, "Client authentication failed. " + oAuthClientAuthnContext.getErrorMessage(), "issue-access-token", null);
        }
        tokenRespDTO = handleError(oAuthClientAuthnContext.getErrorCode(), oAuthClientAuthnContext.getErrorMessage(), tokenReqDTO);
        setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        return tokenRespDTO;
    }
    // loading the stored application data
    OAuthAppDO oAuthAppDO = getOAuthApplication(tokenReqDTO.getClientId());
    // set the tenantDomain of the SP in the tokenReqDTO
    // Indirectly we can say that the tenantDomain of the SP is the tenantDomain of the user who created SP.
    // This is done to avoid having to send the tenantDomain as a query param to the token endpoint
    String tenantDomainOfApp = OAuth2Util.getTenantDomainOfOauthApp(oAuthAppDO);
    validateRequestTenantDomain(tenantDomainOfApp);
    tokenReqDTO.setTenantDomain(tenantDomainOfApp);
    tokReqMsgCtx.addProperty(OAUTH_APP_DO, oAuthAppDO);
    boolean isOfTypeApplicationUser = authzGrantHandler.isOfTypeApplicationUser();
    if (!isOfTypeApplicationUser) {
        tokReqMsgCtx.setAuthorizedUser(oAuthAppDO.getAppOwner());
        tokReqMsgCtx.addProperty(OAuthConstants.UserType.USER_TYPE, OAuthConstants.UserType.APPLICATION);
    } else {
        tokReqMsgCtx.addProperty(OAuthConstants.UserType.USER_TYPE, OAuthConstants.UserType.APPLICATION_USER);
    }
    boolean isAuthorizedClient = false;
    String error = "The authenticated client is not authorized to use this authorization grant type";
    try {
        isAuthorizedClient = authzGrantHandler.isAuthorizedClient(tokReqMsgCtx);
    } catch (IdentityOAuth2Exception e) {
        if (log.isDebugEnabled()) {
            log.debug("Error occurred while validating client for authorization", e);
        }
        LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, null, OAuthConstants.LogConstants.FAILED, "System error occurred.", "issue-access-token", null);
        error = e.getMessage();
    }
    if (!isAuthorizedClient) {
        if (log.isDebugEnabled()) {
            log.debug("Client Id: " + tokenReqDTO.getClientId() + " is not authorized to use grant type: " + grantType);
        }
        if (LoggerUtils.isDiagnosticLogsEnabled()) {
            Map<String, Object> params = new HashMap<>();
            params.put("clientId", tokenReqDTO.getClientId());
            params.put("grantType", grantType);
            LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.FAILED, "Client is not authorized to use the requested grant type.", "issue-access-token", null);
        }
        tokenRespDTO = handleError(OAuthError.TokenResponse.UNAUTHORIZED_CLIENT, error, tokenReqDTO);
        setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        return tokenRespDTO;
    }
    boolean isValidGrant = false;
    error = "Provided Authorization Grant is invalid";
    String errorCode = OAuthError.TokenResponse.INVALID_GRANT;
    try {
        isValidGrant = authzGrantHandler.validateGrant(tokReqMsgCtx);
    } catch (IdentityOAuth2Exception e) {
        if (log.isDebugEnabled()) {
            log.debug("Error occurred while validating grant", e);
        }
        if (e.getErrorCode() != null) {
            errorCode = e.getErrorCode();
        }
        error = e.getMessage();
        if (e.getErrorCode() != null) {
            errorCode = e.getErrorCode();
        }
    }
    if (tokReqMsgCtx.getAuthorizedUser() != null && tokReqMsgCtx.getAuthorizedUser().isFederatedUser()) {
        tokReqMsgCtx.getAuthorizedUser().setTenantDomain(tenantDomainOfApp);
    }
    if (!isValidGrant) {
        if (log.isDebugEnabled()) {
            log.debug("Invalid Grant provided by the client Id: " + tokenReqDTO.getClientId());
        }
        tokenRespDTO = handleError(errorCode, error, tokenReqDTO);
        setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        return tokenRespDTO;
    }
    boolean isAuthorized = authzGrantHandler.authorizeAccessDelegation(tokReqMsgCtx);
    if (!isAuthorized) {
        if (log.isDebugEnabled()) {
            log.debug("Invalid authorization for client Id : " + tokenReqDTO.getClientId());
        }
        tokenRespDTO = handleError(OAuthError.TokenResponse.UNAUTHORIZED_CLIENT, "Unauthorized Client!", tokenReqDTO);
        setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        return tokenRespDTO;
    }
    List<String> allowedScopes = OAuthServerConfiguration.getInstance().getAllowedScopes();
    List<String> requestedAllowedScopes = new ArrayList<>();
    String[] requestedScopes = tokReqMsgCtx.getScope();
    List<String> scopesToBeValidated = new ArrayList<>();
    if (requestedScopes != null) {
        for (String scope : requestedScopes) {
            if (OAuth2Util.isAllowedScope(allowedScopes, scope)) {
                requestedAllowedScopes.add(scope);
            } else {
                scopesToBeValidated.add(scope);
            }
        }
        tokReqMsgCtx.setScope(scopesToBeValidated.toArray(new String[0]));
    }
    String[] authorizedInternalScopes = new String[0];
    boolean isManagementApp = getServiceProvider(tokenReqDTO).isManagementApp();
    if (isManagementApp) {
        if (log.isDebugEnabled()) {
            log.debug("Handling the internal scope validation.");
        }
        // Execute Internal SCOPE Validation.
        JDBCPermissionBasedInternalScopeValidator scopeValidator = new JDBCPermissionBasedInternalScopeValidator();
        authorizedInternalScopes = scopeValidator.validateScope(tokReqMsgCtx);
        // Execute internal console scopes validation.
        if (IdentityUtil.isSystemRolesEnabled()) {
            RoleBasedInternalScopeValidator roleBasedInternalScopeValidator = new RoleBasedInternalScopeValidator();
            String[] roleBasedInternalConsoleScopes = roleBasedInternalScopeValidator.validateScope(tokReqMsgCtx);
            authorizedInternalScopes = (String[]) ArrayUtils.addAll(authorizedInternalScopes, roleBasedInternalConsoleScopes);
        }
    } else {
        if (log.isDebugEnabled()) {
            log.debug("Skipping the internal scope validation as the application is not" + " configured as Management App");
        }
    }
    // Clear the internal scopes. Internal scopes should only handle in JDBCPermissionBasedInternalScopeValidator.
    // Those scopes should not send to the other scopes validators.
    // Thus remove the scopes from the tokReqMsgCtx. Will be added to the response after executing
    // the other scope validators.
    removeInternalScopes(tokReqMsgCtx);
    // Adding the authorized internal scopes to tokReqMsgCtx for any special validators to use.
    tokReqMsgCtx.setAuthorizedInternalScopes(authorizedInternalScopes);
    boolean isDropUnregisteredScopes = OAuthServerConfiguration.getInstance().isDropUnregisteredScopes();
    if (isDropUnregisteredScopes) {
        if (log.isDebugEnabled()) {
            log.debug("DropUnregisteredScopes config is enabled. Attempting to drop unregistered scopes.");
        }
        String[] filteredScopes = OAuth2Util.dropUnregisteredScopes(tokReqMsgCtx.getScope(), tokReqMsgCtx.getOauth2AccessTokenReqDTO().getTenantDomain());
        tokReqMsgCtx.setScope(filteredScopes);
    }
    boolean isValidScope = authzGrantHandler.validateScope(tokReqMsgCtx);
    if (isValidScope) {
        if (LoggerUtils.isDiagnosticLogsEnabled()) {
            Map<String, Object> params = new HashMap<>();
            params.put("clientId", tokenReqDTO.getClientId());
            if (ArrayUtils.isNotEmpty(tokenReqDTO.getScope())) {
                params.put("scope", Arrays.asList(tokenReqDTO.getScope()));
            }
            LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.SUCCESS, "OAuth scope validation is successful.", "validate-scope", null);
        }
        // Add authorized internal scopes to the request for sending in the response.
        addAuthorizedInternalScopes(tokReqMsgCtx, tokReqMsgCtx.getAuthorizedInternalScopes());
        addAllowedScopes(tokReqMsgCtx, requestedAllowedScopes.toArray(new String[0]));
    } else {
        if (log.isDebugEnabled()) {
            log.debug("Invalid scope provided by client Id: " + tokenReqDTO.getClientId());
        }
        if (LoggerUtils.isDiagnosticLogsEnabled()) {
            Map<String, Object> params = new HashMap<>();
            params.put("clientId", tokenReqDTO.getClientId());
            if (ArrayUtils.isNotEmpty(tokenReqDTO.getScope())) {
                params.put("scope", Arrays.asList(tokenReqDTO.getScope()));
            }
            LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.FAILED, "Invalid scope provided in the request.", "validate-scope", null);
        }
        tokenRespDTO = handleError(OAuthError.TokenResponse.INVALID_SCOPE, "Invalid Scope!", tokenReqDTO);
        setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        return tokenRespDTO;
    }
    handleTokenBinding(tokenReqDTO, grantType, tokReqMsgCtx, oAuthAppDO);
    try {
        // set the token request context to be used by downstream handlers. This is introduced as a fix for
        // IDENTITY-4111.
        OAuth2Util.setTokenRequestContext(tokReqMsgCtx);
        AuthenticatedUser authorizedUser = tokReqMsgCtx.getAuthorizedUser();
        if (authorizedUser.getAuthenticatedSubjectIdentifier() == null) {
            authorizedUser.setAuthenticatedSubjectIdentifier(getSubjectClaim(getServiceProvider(tokReqMsgCtx.getOauth2AccessTokenReqDTO()), authorizedUser));
        }
        tokenRespDTO = authzGrantHandler.issue(tokReqMsgCtx);
        if (tokenRespDTO.isError()) {
            setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
            return tokenRespDTO;
        }
    } finally {
        triggerPostListeners(tokenReqDTO, tokenRespDTO, tokReqMsgCtx, isRefreshRequest);
        // clears the token request context.
        OAuth2Util.clearTokenRequestContext();
    }
    tokenRespDTO.setCallbackURI(oAuthAppDO.getCallbackUrl());
    String[] scopes = tokReqMsgCtx.getScope();
    if (scopes != null && scopes.length > 0) {
        StringBuilder scopeString = new StringBuilder("");
        for (String scope : scopes) {
            scopeString.append(scope);
            scopeString.append(" ");
        }
        tokenRespDTO.setAuthorizedScopes(scopeString.toString().trim());
    }
    setResponseHeaders(tokReqMsgCtx, tokenRespDTO);
    // Do not change this log format as these logs use by external applications
    if (log.isDebugEnabled()) {
        log.debug("Access token issued to client Id: " + tokenReqDTO.getClientId() + " username: " + tokReqMsgCtx.getAuthorizedUser() + " and scopes: " + tokenRespDTO.getAuthorizedScopes());
    }
    if (LoggerUtils.isDiagnosticLogsEnabled()) {
        Map<String, Object> params = new HashMap<>();
        params.put("clientId", tokenReqDTO.getClientId());
        LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.SUCCESS, "Access token issued for the application.", "issue-access-token", null);
    }
    if (GrantType.AUTHORIZATION_CODE.toString().equals(grantType)) {
        // Should add user attributes to the cache before building the ID token.
        addUserAttributesAgainstAccessToken(tokenReqDTO, tokenRespDTO);
    }
    if (tokReqMsgCtx.getScope() != null && OAuth2Util.isOIDCAuthzRequest(tokReqMsgCtx.getScope())) {
        if (log.isDebugEnabled()) {
            log.debug("Issuing ID token for client: " + tokenReqDTO.getClientId());
        }
        IDTokenBuilder builder = OAuthServerConfiguration.getInstance().getOpenIDConnectIDTokenBuilder();
        try {
            String idToken = builder.buildIDToken(tokReqMsgCtx, tokenRespDTO);
            if (LoggerUtils.isDiagnosticLogsEnabled()) {
                Map<String, Object> params = new HashMap<>();
                params.put("clientId", tokenReqDTO.getClientId());
                LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.SUCCESS, "ID token issued for the application.", "issue-id-token", null);
            }
            tokenRespDTO.setIDToken(idToken);
        } catch (IDTokenValidationFailureException e) {
            log.error(e.getMessage());
            if (LoggerUtils.isDiagnosticLogsEnabled()) {
                Map<String, Object> params = new HashMap<>();
                params.put("clientId", tokenReqDTO.getClientId());
                LoggerUtils.triggerDiagnosticLogEvent(OAuthConstants.LogConstants.OAUTH_INBOUND_SERVICE, params, OAuthConstants.LogConstants.FAILED, "System error occurred.", "issue-id-token", null);
            }
            tokenRespDTO = handleError(OAuth2ErrorCodes.SERVER_ERROR, "Server Error", tokenReqDTO);
            return tokenRespDTO;
        }
    }
    if (GrantType.AUTHORIZATION_CODE.toString().equals(grantType)) {
        // Cache entry against the authorization code has no value beyond the token request.
        clearCacheEntryAgainstAuthorizationCode(getAuthorizationCode(tokenReqDTO));
    }
    return tokenRespDTO;
}
Also used : AuthorizationGrantHandler(org.wso2.carbon.identity.oauth2.token.handlers.grant.AuthorizationGrantHandler) HashMap(java.util.HashMap) JDBCPermissionBasedInternalScopeValidator(org.wso2.carbon.identity.oauth2.validators.JDBCPermissionBasedInternalScopeValidator) ArrayList(java.util.ArrayList) OAuthClientAuthnContext(org.wso2.carbon.identity.oauth2.bean.OAuthClientAuthnContext) AuthenticatedUser(org.wso2.carbon.identity.application.authentication.framework.model.AuthenticatedUser) OAuthAppDO(org.wso2.carbon.identity.oauth.dao.OAuthAppDO) IDTokenBuilder(org.wso2.carbon.identity.openidconnect.IDTokenBuilder) RoleBasedInternalScopeValidator(org.wso2.carbon.identity.oauth2.validators.RoleBasedInternalScopeValidator) OAuth2AccessTokenRespDTO(org.wso2.carbon.identity.oauth2.dto.OAuth2AccessTokenRespDTO) IdentityOAuth2Exception(org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception) IDTokenValidationFailureException(org.wso2.carbon.identity.oauth2.IDTokenValidationFailureException) Map(java.util.Map) HashMap(java.util.HashMap)

Aggregations

IDTokenValidationFailureException (org.wso2.carbon.identity.oauth2.IDTokenValidationFailureException)3 AuthenticatedUser (org.wso2.carbon.identity.application.authentication.framework.model.AuthenticatedUser)2 OAuthAppDO (org.wso2.carbon.identity.oauth.dao.OAuthAppDO)2 IdentityOAuth2Exception (org.wso2.carbon.identity.oauth2.IdentityOAuth2Exception)2 OAuth2AccessTokenRespDTO (org.wso2.carbon.identity.oauth2.dto.OAuth2AccessTokenRespDTO)2 IDTokenBuilder (org.wso2.carbon.identity.openidconnect.IDTokenBuilder)2 JWTClaimsSet (com.nimbusds.jwt.JWTClaimsSet)1 PlainJWT (com.nimbusds.jwt.PlainJWT)1 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 AuthorizationGrantCacheEntry (org.wso2.carbon.identity.oauth.cache.AuthorizationGrantCacheEntry)1 InvalidOAuthClientException (org.wso2.carbon.identity.oauth.common.exception.InvalidOAuthClientException)1 OAuthClientAuthnContext (org.wso2.carbon.identity.oauth2.bean.OAuthClientAuthnContext)1 AuthorizationGrantHandler (org.wso2.carbon.identity.oauth2.token.handlers.grant.AuthorizationGrantHandler)1 JDBCPermissionBasedInternalScopeValidator (org.wso2.carbon.identity.oauth2.validators.JDBCPermissionBasedInternalScopeValidator)1 RoleBasedInternalScopeValidator (org.wso2.carbon.identity.oauth2.validators.RoleBasedInternalScopeValidator)1