/* * oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text. * * Copyright (c) 2014, Gluu */ package org.xdi.oxauth.ws.rs; import org.testng.annotations.Parameters; import org.testng.annotations.Test; import org.xdi.oxauth.BaseTest; import org.xdi.oxauth.client.*; import org.xdi.oxauth.model.common.*; import org.xdi.oxauth.model.jwt.JwtClaimName; import org.xdi.oxauth.model.register.ApplicationType; import org.xdi.oxauth.model.util.StringUtils; import java.util.Arrays; import java.util.UUID; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; /** * Functional tests for SSO with Multiple Backend Services (HTTP) * * @author Javier Rojas Blum * @version December 12, 2016 */ public class SSOWithMultipleBackendServicesHttpTest extends BaseTest { @Parameters({"redirectUris", "userId", "userSecret", "redirectUri", "sectorIdentifierUri"}) @Test public void sessionWorkFlow1( final String redirectUris, final String userId, final String userSecret, final String redirectUri, final String sectorIdentifierUri) throws Exception { showTitle("sessionWorkFlow1"); // Register client RegisterRequest registerRequest = new RegisterRequest(ApplicationType.WEB, "oxAuth test app", StringUtils.spaceSeparatedToList(redirectUris)); registerRequest.setTokenEndpointAuthMethod(AuthenticationMethod.CLIENT_SECRET_BASIC); registerRequest.setSectorIdentifierUri(sectorIdentifierUri); RegisterClient registerClient = new RegisterClient(registrationEndpoint); registerClient.setRequest(registerRequest); RegisterResponse registerResponse = registerClient.exec(); showClient(registerClient); assertEquals(registerResponse.getStatus(), 200, "Unexpected response code: " + registerResponse.getEntity()); assertNotNull(registerResponse.getClientId()); assertNotNull(registerResponse.getClientSecret()); assertNotNull(registerResponse.getRegistrationAccessToken()); assertNotNull(registerResponse.getClientIdIssuedAt()); assertNotNull(registerResponse.getClientSecretExpiresAt()); String clientId = registerResponse.getClientId(); String clientSecret = registerResponse.getClientSecret(); String state1 = UUID.randomUUID().toString(); AuthorizationRequest authorizationRequest1 = new AuthorizationRequest( Arrays.asList(ResponseType.CODE), clientId, Arrays.asList("openid", "profile", "email"), redirectUri, null); authorizationRequest1.setState(state1); authorizationRequest1.setRequestSessionState(true); AuthorizationResponse authorizationResponse1 = authenticateResourceOwnerAndGrantAccess( authorizationEndpoint, authorizationRequest1, userId, userSecret); assertNotNull(authorizationResponse1.getLocation(), "The location is null"); assertNotNull(authorizationResponse1.getCode(), "The authorization code is null"); assertNotNull(authorizationResponse1.getSessionState(), "The session state is null"); assertNotNull(authorizationResponse1.getScope(), "The scope is null"); assertNotNull(authorizationResponse1.getState(), "The state is null"); assertEquals(authorizationResponse1.getState(), state1); String code1 = authorizationResponse1.getCode(); String sessionState = authorizationResponse1.getSessionState(); // TV sends the code to the Backend // We don't use httpClient and cookieStore during this call //////////////////////////////////////////////// // Backend 1 side. Code 1 // //////////////////////////////////////////////// // Get the access token TokenClient tokenClient1 = new TokenClient(tokenEndpoint); TokenResponse tokenResponse1 = tokenClient1.execAuthorizationCode(code1, redirectUri, clientId, clientSecret); showClient(tokenClient1); assertEquals(tokenResponse1.getStatus(), 200, "Unexpected response code: " + tokenResponse1.getStatus()); assertNotNull(tokenResponse1.getEntity(), "The entity is null"); assertNotNull(tokenResponse1.getAccessToken(), "The access token is null"); assertNotNull(tokenResponse1.getExpiresIn(), "The expires in value is null"); assertNotNull(tokenResponse1.getTokenType(), "The token type is null"); assertNotNull(tokenResponse1.getRefreshToken(), "The refresh token is null"); String accessToken1 = tokenResponse1.getAccessToken(); // Get the user's claims UserInfoClient userInfoClient1 = new UserInfoClient(userInfoEndpoint); UserInfoResponse userInfoResponse1 = userInfoClient1.execUserInfo(accessToken1); showClient(userInfoClient1); assertEquals(userInfoResponse1.getStatus(), 200, "Unexpected response code: " + userInfoResponse1.getStatus()); assertNotNull(userInfoResponse1.getClaim(JwtClaimName.SUBJECT_IDENTIFIER), "Unexpected result: subject not found"); assertNotNull(userInfoResponse1.getClaim(JwtClaimName.NAME), "Unexpected result: name not found"); assertNotNull(userInfoResponse1.getClaim(JwtClaimName.GIVEN_NAME), "Unexpected result: given_name not found"); assertNotNull(userInfoResponse1.getClaim(JwtClaimName.FAMILY_NAME), "Unexpected result: family_name not found"); assertNotNull(userInfoResponse1.getClaim(JwtClaimName.EMAIL), "Unexpected result: email not found"); //////////////////////////////////////////////// // TV side. Code 2 // //////////////////////////////////////////////// String state2 = UUID.randomUUID().toString(); AuthorizationRequest authorizationRequest2 = new AuthorizationRequest( Arrays.asList(ResponseType.CODE), clientId, Arrays.asList("openid", "profile", "email"), redirectUri, null); authorizationRequest2.getPrompts().add(Prompt.NONE); authorizationRequest2.setState(state2); authorizationRequest2.setSessionState(sessionState); AuthorizeClient authorizeClient2 = new AuthorizeClient(authorizationEndpoint); authorizeClient2.setRequest(authorizationRequest2); AuthorizationResponse authorizationResponse2 = authorizeClient2.exec(); showClient(authorizeClient2); assertEquals(authorizationResponse2.getStatus(), 302, "Unexpected response code: " + authorizationResponse2.getStatus()); assertNotNull(authorizationResponse2.getLocation(), "The location is null"); assertNotNull(authorizationResponse2.getCode(), "The authorization code is null"); assertNotNull(authorizationResponse2.getScope(), "The scope is null"); assertNotNull(authorizationResponse2.getState(), "The state is null"); assertEquals(authorizationResponse2.getState(), state2); String code2 = authorizationResponse2.getCode(); // TV sends the code to the Backend // We don't use httpClient and cookieStore during this call //////////////////////////////////////////////// // Backend 2 side. Code 2 // //////////////////////////////////////////////// // Get the access token TokenClient tokenClient2 = new TokenClient(tokenEndpoint); TokenResponse tokenResponse2 = tokenClient2.execAuthorizationCode(code2, redirectUri, clientId, clientSecret); showClient(tokenClient2); assertEquals(tokenResponse2.getStatus(), 200, "Unexpected response code: " + tokenResponse2.getStatus()); assertNotNull(tokenResponse2.getEntity(), "The entity is null"); assertNotNull(tokenResponse2.getAccessToken(), "The access token is null"); assertNotNull(tokenResponse2.getExpiresIn(), "The expires in value is null"); assertNotNull(tokenResponse2.getTokenType(), "The token type is null"); assertNotNull(tokenResponse2.getRefreshToken(), "The refresh token is null"); String accessToken2 = tokenResponse2.getAccessToken(); // Get the user's claims UserInfoClient userInfoClient2 = new UserInfoClient(userInfoEndpoint); UserInfoResponse userInfoResponse2 = userInfoClient2.execUserInfo(accessToken2); showClient(userInfoClient2); assertEquals(userInfoResponse2.getStatus(), 200, "Unexpected response code: " + userInfoResponse2.getStatus()); assertNotNull(userInfoResponse2.getClaim(JwtClaimName.SUBJECT_IDENTIFIER), "Unexpected result: subject not found"); assertNotNull(userInfoResponse2.getClaim(JwtClaimName.NAME), "Unexpected result: name not found"); assertNotNull(userInfoResponse2.getClaim(JwtClaimName.GIVEN_NAME), "Unexpected result: given_name not found"); assertNotNull(userInfoResponse2.getClaim(JwtClaimName.FAMILY_NAME), "Unexpected result: family_name not found"); assertNotNull(userInfoResponse2.getClaim(JwtClaimName.EMAIL), "Unexpected result: email not found"); } @Parameters({"redirectUris", "redirectUri", "userInum", "userEmail", "sectorIdentifierUri"}) @Test public void sessionWorkFlow2( final String redirectUris, final String redirectUri, final String userInum, final String userEmail, final String sectorIdentifierUri) throws Exception { showTitle("sessionWorkFlow2"); // Register client RegisterRequest registerRequest = new RegisterRequest(ApplicationType.WEB, "oxAuth test app", StringUtils.spaceSeparatedToList(redirectUris)); registerRequest.setTokenEndpointAuthMethod(AuthenticationMethod.CLIENT_SECRET_POST); registerRequest.setSectorIdentifierUri(sectorIdentifierUri); RegisterClient registerClient = new RegisterClient(registrationEndpoint); registerClient.setRequest(registerRequest); RegisterResponse registerResponse = registerClient.exec(); showClient(registerClient); assertEquals(registerResponse.getStatus(), 200, "Unexpected response code: " + registerResponse.getEntity()); assertNotNull(registerResponse.getClientId()); assertNotNull(registerResponse.getClientSecret()); assertNotNull(registerResponse.getRegistrationAccessToken()); assertNotNull(registerResponse.getClientIdIssuedAt()); assertNotNull(registerResponse.getClientSecretExpiresAt()); String clientId = registerResponse.getClientId(); String clientSecret = registerResponse.getClientSecret(); // Authorization code flow to authenticate on B1 String state1 = UUID.randomUUID().toString(); AuthorizationRequest authorizationRequest1 = new AuthorizationRequest( Arrays.asList(ResponseType.CODE), clientId, Arrays.asList("openid", "profile", "email"), redirectUri, null); authorizationRequest1.addCustomParameter("mail", userEmail); authorizationRequest1.addCustomParameter("inum", userInum); authorizationRequest1.getPrompts().add(Prompt.NONE); authorizationRequest1.setState(state1); authorizationRequest1.setAuthorizationMethod(AuthorizationMethod.FORM_ENCODED_BODY_PARAMETER); authorizationRequest1.setRequestSessionState(true); AuthorizationResponse authorizationResponse1 = authorizationRequestAndGrantAccess( authorizationEndpoint, authorizationRequest1); assertNotNull(authorizationResponse1.getLocation(), "The location is null"); assertNotNull(authorizationResponse1.getCode(), "The authorization code is null"); assertNotNull(authorizationResponse1.getSessionState(), "The session id is null"); assertNotNull(authorizationResponse1.getScope(), "The scope is null"); assertNotNull(authorizationResponse1.getState(), "The state is null"); assertEquals(authorizationRequest1.getState(), state1); String authorizationCode1 = authorizationResponse1.getCode(); String sessionState = authorizationResponse1.getSessionState(); TokenRequest tokenRequest1 = new TokenRequest(GrantType.AUTHORIZATION_CODE); tokenRequest1.setCode(authorizationCode1); tokenRequest1.setRedirectUri(redirectUri); tokenRequest1.setAuthUsername(clientId); tokenRequest1.setAuthPassword(clientSecret); tokenRequest1.setAuthenticationMethod(AuthenticationMethod.CLIENT_SECRET_POST); TokenClient tokenClient1 = new TokenClient(tokenEndpoint); tokenClient1.setRequest(tokenRequest1); TokenResponse tokenResponse1 = tokenClient1.exec(); showClient(tokenClient1); assertEquals(tokenResponse1.getStatus(), 200, "Unexpected response code: " + tokenResponse1.getStatus()); assertNotNull(tokenResponse1.getEntity(), "The entity is null"); assertNotNull(tokenResponse1.getAccessToken(), "The access token is null"); assertNotNull(tokenResponse1.getExpiresIn(), "The expires in value is null"); assertNotNull(tokenResponse1.getTokenType(), "The token type is null"); assertNotNull(tokenResponse1.getRefreshToken(), "The refresh token is null"); // User wants to authenticate on B2 (without sending its credentials) String state2 = UUID.randomUUID().toString(); AuthorizationRequest authorizationRequest2 = new AuthorizationRequest( Arrays.asList(ResponseType.CODE), clientId, Arrays.asList("openid", "profile", "email"), redirectUri, null); authorizationRequest2.getPrompts().add(Prompt.NONE); authorizationRequest2.setState(state2); authorizationRequest2.setSessionState(sessionState); AuthorizeClient authorizeClient2 = new AuthorizeClient(authorizationEndpoint); authorizeClient2.setRequest(authorizationRequest2); AuthorizationResponse authorizationResponse2 = authorizeClient2.exec(); showClient(authorizeClient2); assertEquals(authorizationResponse2.getStatus(), 302, "Unexpected response code: " + authorizationResponse2.getStatus()); assertNotNull(authorizationResponse2.getLocation(), "The location is null"); assertNotNull(authorizationResponse2.getCode(), "The authorization code is null"); assertNotNull(authorizationResponse2.getScope(), "The scope is null"); assertNotNull(authorizationResponse2.getState(), "The state is null"); assertEquals(authorizationResponse2.getState(), state2); String authorizationCode2 = authorizationResponse2.getCode(); TokenRequest tokenRequest2 = new TokenRequest(GrantType.AUTHORIZATION_CODE); tokenRequest2.setCode(authorizationCode2); tokenRequest2.setRedirectUri(redirectUri); tokenRequest2.setAuthUsername(clientId); tokenRequest2.setAuthPassword(clientSecret); tokenRequest2.setAuthenticationMethod(AuthenticationMethod.CLIENT_SECRET_POST); TokenClient tokenClient2 = new TokenClient(tokenEndpoint); tokenClient2.setRequest(tokenRequest2); TokenResponse tokenResponse2 = tokenClient2.exec(); showClient(tokenClient2); assertEquals(tokenResponse2.getStatus(), 200, "Unexpected response code: " + tokenResponse2.getStatus()); assertNotNull(tokenResponse2.getEntity(), "The entity is null"); assertNotNull(tokenResponse2.getAccessToken(), "The access token is null"); assertNotNull(tokenResponse2.getExpiresIn(), "The expires in value is null"); assertNotNull(tokenResponse2.getTokenType(), "The token type is null"); assertNotNull(tokenResponse2.getRefreshToken(), "The refresh token is null"); // User wants to authenticate on B3 (without sending its credentials) String state3 = UUID.randomUUID().toString(); AuthorizationRequest authorizationRequest3 = new AuthorizationRequest( Arrays.asList(ResponseType.CODE), clientId, Arrays.asList("openid", "profile", "email"), redirectUri, null); authorizationRequest3.getPrompts().add(Prompt.NONE); authorizationRequest3.setState(state3); authorizationRequest3.setSessionState(sessionState); AuthorizeClient authorizeClient3 = new AuthorizeClient(authorizationEndpoint); authorizeClient3.setRequest(authorizationRequest3); AuthorizationResponse authorizationResponse3 = authorizeClient3.exec(); showClient(authorizeClient3); assertEquals(authorizationResponse3.getStatus(), 302, "Unexpected response code: " + authorizationResponse3.getStatus()); assertNotNull(authorizationResponse3.getLocation(), "The location is null"); assertNotNull(authorizationResponse3.getCode(), "The authorization code is null"); assertNotNull(authorizationResponse3.getScope(), "The scope is null"); assertNotNull(authorizationResponse3.getState(), "The state is null"); assertEquals(authorizationResponse3.getState(), state3); String authorizationCode3 = authorizationResponse3.getCode(); TokenRequest tokenRequest3 = new TokenRequest(GrantType.AUTHORIZATION_CODE); tokenRequest3.setCode(authorizationCode3); tokenRequest3.setRedirectUri(redirectUri); tokenRequest3.setAuthUsername(clientId); tokenRequest3.setAuthPassword(clientSecret); tokenRequest3.setAuthenticationMethod(AuthenticationMethod.CLIENT_SECRET_POST); TokenClient tokenClient3 = new TokenClient(tokenEndpoint); tokenClient3.setRequest(tokenRequest3); TokenResponse tokenResponse3 = tokenClient3.exec(); showClient(tokenClient3); assertEquals(tokenResponse3.getStatus(), 200, "Unexpected response code: " + tokenResponse3.getStatus()); assertNotNull(tokenResponse3.getEntity(), "The entity is null"); assertNotNull(tokenResponse3.getAccessToken(), "The access token is null"); assertNotNull(tokenResponse3.getExpiresIn(), "The expires in value is null"); assertNotNull(tokenResponse3.getTokenType(), "The token type is null"); assertNotNull(tokenResponse3.getRefreshToken(), "The refresh token is null"); } }