Search code examples
spring-bootoauth-2.0gmailgmail-api

How to get email address from authorization code OAuth2


When User Sign In Gmail account via Oauth2 protocol and finish it, my server get authorization code and I make exchange this code for refresh token and access token, everything works as planned but I need to get email address too. I mean if user logged in as [email protected], somehow with authorization code I would like to know this address, may I somehow to know it?

This is endpoint where I exchange authorization code on access token and refresh token:

 public OAuth2AccessToken oauth(String authorizationCode) {
        AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails();
        resource.setUserAuthorizationUri(userAuthorizationUri);
        resource.setAccessTokenUri(accessTokenUri);
        resource.setClientId(clientId);
        resource.setClientSecret(clientSecret);
        resource.setPreEstablishedRedirectUri(redirectUrl);
        resource.setScope(scopes);
        resource.setUseCurrentUri(false);

        AccessTokenRequest request = new DefaultAccessTokenRequest();
        request.setPreservedState(new Object());
        request.setAuthorizationCode(authorizationCode);

        AuthorizationCodeAccessTokenProvider provider = new AuthorizationCodeAccessTokenProvider();
        OAuth2AccessToken accessToken = provider.obtainAccessToken(resource, request);

        return accessToken;
    }

I don't have WebSecurityConfigurerAdapter for OAuth2


Solution

  • If the user's email address is not already provided in the id_token part of the oauth2 response, you can use the Gmail API Users.getProfile operation, using the special value "me" as the userId to refer to the authenticated user.

    See: https://developers.google.com/gmail/api/v1/reference/users/getProfile

    That should give you a response like:

    {
      "emailAddress": -string-,
      "messagesTotal": -integer-,
      "threadsTotal": -integer-,
      "historyId": -unsigned long-
    }