2017-04-11 1 views
0

Actuellement je travaille flux d'authentification OAuth2 avec suivante config Java:Comment définir le paramètre de domaine hébergé dans Google OAuth2 AccountChooser avec Java config?

@Configuration 
@EnableOAuth2Client 
@Import(SecurityWebAppInitializer.class) 
public class OAuth2SecurityConfiguration { 

    @Resource 
    private GoogleClientSecrets googleClientSecrets; 

    @Resource 
    private AccessTokenRequest accessTokenRequest; 

    @Bean 
    public AuthorizationCodeResourceDetails googleResource() { 
     AuthorizationCodeResourceDetails details = new AuthorizationCodeResourceDetails(); 
     GoogleClientSecrets.Details web = googleClientSecrets.getWeb(); 
     details.setId((String) web.get("project_id")); 
     details.setClientId(web.getClientId()); 
     details.setClientSecret(web.getClientSecret()); 
     details.setAccessTokenUri(web.getTokenUri()); 
     details.setUserAuthorizationUri(web.getAuthUri()); 
     details.setTokenName((String) web.get("token_name")); 

     String commaSeparatedScopes = (String) web.get("scope"); 
     details.setScope(parseScopes(commaSeparatedScopes)); 
     details.setPreEstablishedRedirectUri(web.getRedirectUris().get(0)); 
     details.setUseCurrentUri(false); 
     details.setAuthenticationScheme(AuthenticationScheme.query); 
     details.setClientAuthenticationScheme(AuthenticationScheme.form); 
     return details; 
    } 

    private List<String> parseScopes(String commaSeparatedScopes) { 
     List<String> scopes = newArrayList(); 
     Collections.addAll(scopes, commaSeparatedScopes.split(",")); 
     return scopes; 
    } 

    @Bean 
    public OAuth2ClientAuthenticationProcessingFilter oAuth2AuthenticationProcessingFilter(
      OAuth2RestTemplate oAuth2RestTemplate, ResourceServerTokenServices resourceServerTokenServices) { 
     OAuth2ClientAuthenticationProcessingFilter filter = 
       new OAuth2ClientAuthenticationProcessingFilter("/googleLogin"); 
     filter.setRestTemplate(oAuth2RestTemplate); 
     filter.setTokenServices(resourceServerTokenServices); 
     return filter; 
    } 

    @Bean 
    public UserAuthenticationConverter userTokenConverter() { 
     return new DefaultUserAuthenticationConverter(); 
    } 

    @Bean 
    public AccessTokenConverter accessTokenConverter(UserAuthenticationConverter userTokenConverter) { 
     GoogleAccessTokenConverter accessTokenConverter = new GoogleAccessTokenConverter(); 
     accessTokenConverter.setUserTokenConverter(userTokenConverter); 
     return new GoogleAccessTokenConverter(); 
    } 

    @Bean 
    public GoogleTokenServices tokenServices(AccessTokenConverter accessTokenConverter) { 
     GoogleTokenServices tokenServices = new GoogleTokenServices(); 
     GoogleClientSecrets.Details web = googleClientSecrets.getWeb(); 
     tokenServices.setCheckTokenEndpointUrl("https://www.googleapis.com/oauth2/v1/tokeninfo"); 
     tokenServices.setClientId(web.getClientId()); 
     tokenServices.setClientSecret(web.getClientSecret()); 
     tokenServices.setAccessTokenConverter(accessTokenConverter); 
     return tokenServices; 
    } 

    @Bean 
    public OAuth2RestTemplate googleRestTemplate() { 
     return new OAuth2RestTemplate(googleResource(), new DefaultOAuth2ClientContext(accessTokenRequest)); 
    } 

    @Bean 
    public OAuth2ClientContextFilter oauth2ClientContextFilter() { 
     return new OAuth2ClientContextFilter(); 
    } 

    @Bean 
    public LoginUrlAuthenticationEntryPoint clientAuthenticationEntryPoint() { 
     return new LoginUrlAuthenticationEntryPoint("/googleLogin"); 
    } 
} 

et client_secret.json pour mon service google:

{ 
    "web": { 
    "client_id": "...", 
    "project_id": "...", 
    "auth_uri": "https://accounts.google.com/o/oauth2/auth", 
    "token_uri": "https://accounts.google.com/o/oauth2/token", 
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", 
    "client_secret": "...", 
    "redirect_uris": [ 
     "http://localhost:8888/googleLogin", 
     "http://localhost:8888/googleLogin/" 
    ], 
    "scope": "https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/userinfo.profile", 
    "token_name": "authorization_code" 
    } 
} 

Le problème est que je ne sais pas où mettre hosted domain paramètre java code. J'essayais de trouver une solution sur le stackoverflow, mais je n'ai vu que des solutions avec JS ou PHP.

Répondre

1

j'ai découvert AuthorizationCodeAccessTokenProvider#getRedirectForAuthorization est responsable de la construction URI de redirection mais les paramètres disponibles, il sont limités de sorte que le seul choix est d'ajouter le paramètre HD à auth_uri dans client_secrets.json:

"auth_uri": "https://accounts.google.com/o/oauth2/auth?hd=<domain>", 
0

Ajout du paramètre HD à l'URL travaillé. Ajouter ? Hd = MYDOMAIN.com au security.oauth2.client.user-authorization-uri propriété fait l'affaire.

Cette configuration de base fonctionne pour moi dans application.properties - vous pouvez le faire ou yaml. Lorsque la demande de connexion affiche le login google, le domaine est pré-rempli sur le formulaire. Si vous avez déjà ouvert une session sous un domaine privé hébergé par google et un compte Gmail et que vous aviez auparavant besoin de choisir le bon compte, votre compte sera automatiquement choisi avec le domaine correspondant et vous serez redirigé vers la ressource sécurisée.

security.oauth2.client.client-id=123456789-abc123456789.apps.googleusercontent.com 
security.oauth2.client.client-secret=yyyyyyyyyyyyyyyyy 
security.oauth2.client.access-token-uri=https://www.googleapis.com/oauth2/v3/token 
security.oauth2.client.user-authorization-uri=https://accounts.google.com/o/oauth2/auth?hd=MYDOMAIN.com 
security.oauth2.client.authentication-scheme=query 
security.oauth2.client.scope=email 
security.oauth2.client. 
security.oauth2.client.client-authentication-scheme=form 
security.oauth2.resource.user-info-uri=https://www.googleapis.com/plus/v1/people/me 
security.oauth2.resource.prefer-token-info=false