package org.apereo.cas.support.pac4j.authentication.handler.support;
import org.apereo.cas.authentication.HandlerResult;
import org.apereo.cas.authentication.PreventedException;
import org.apereo.cas.authentication.principal.ClientCredential;
import org.apereo.cas.authentication.principal.Principal;
import org.apereo.cas.services.ServicesManager;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.pac4j.core.client.Clients;
import org.pac4j.core.credentials.Credentials;
import org.pac4j.oauth.client.FacebookClient;
import org.pac4j.oauth.credentials.OAuth20Credentials;
import org.pac4j.oauth.profile.facebook.FacebookProfile;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration;
import org.springframework.webflow.context.ExternalContextHolder;
import org.springframework.webflow.context.servlet.ServletExternalContext;
import javax.security.auth.login.FailedLoginException;
import java.security.GeneralSecurityException;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* Tests the {@link ClientAuthenticationHandler}.
*
* @author Jerome Leleu
* @since 4.1.0
*
*/
@SpringBootTest(classes = {RefreshAutoConfiguration.class})
public class ClientAuthenticationHandlerTests {
private static final String CALLBACK_URL = "http://localhost:8080/callback";
private static final String ID = "123456789";
@Rule
public ExpectedException thrown = ExpectedException.none();
private FacebookClient fbClient;
private ClientAuthenticationHandler handler;
private ClientCredential clientCredential;
@Before
public void setUp() {
this.fbClient = new FacebookClient();
final Clients clients = new Clients(CALLBACK_URL, fbClient);
this.handler = new ClientAuthenticationHandler("", mock(ServicesManager.class), null, clients);
this.handler.setTypedIdUsed(true);
final Credentials credentials = new OAuth20Credentials(null, fbClient.getName());
this.clientCredential = new ClientCredential(credentials);
ExternalContextHolder.setExternalContext(mock(ServletExternalContext.class));
}
@Test
public void verifyOk() throws GeneralSecurityException, PreventedException {
final FacebookProfile facebookProfile = new FacebookProfile();
facebookProfile.setId(ID);
this.fbClient.setProfileCreator((oAuth20Credentials, webContext) -> facebookProfile);
final HandlerResult result = this.handler.authenticate(this.clientCredential);
final Principal principal = result.getPrincipal();
assertEquals(FacebookProfile.class.getName() + '#' + ID, principal.getId());
}
@Test
public void verifyOkWithSimpleIdentifier() throws GeneralSecurityException, PreventedException {
this.handler.setTypedIdUsed(false);
final FacebookProfile facebookProfile = new FacebookProfile();
facebookProfile.setId(ID);
this.fbClient.setProfileCreator((oAuth20Credentials, webContext) -> facebookProfile);
final HandlerResult result = this.handler.authenticate(this.clientCredential);
final Principal principal = result.getPrincipal();
assertEquals(ID, principal.getId());
}
@Test
public void verifyNoProfile() throws GeneralSecurityException, PreventedException {
this.thrown.expect(FailedLoginException.class);
this.fbClient.setProfileCreator((oAuth20Credentials, webContext) -> null);
this.handler.authenticate(this.clientCredential);
}
}