Как получить доступ к электронной почте пользователя после звонка gapi.auth2.authorize - PullRequest
0 голосов
/ 27 декабря 2018

Мы разрешаем пользователям дополнительно проходить аутентификацию в нашем приложении, используя свои учетные данные Google через oauth.Это работает нормально, однако Google прекращает вызов Google + API, который мы используем, чтобы получить их адрес электронной почты, который будет проблемой для нас.К сожалению, я постарался найти правильный подход для получения электронной почты, поэтому любые предложения будут оценены.

Вот текущий код: var developerKey = 'our key';var clientId = 'наш идентификатор';var scope = ['email'];var oauthToken;

        // authorize the current user with Google
        function authorizeGoogleUser() {
            gapi.auth2.authorize({
                'client_id': clientId,
                'scope': scope,
                'immediate': false
            },
            handleAuthorizeCallback);
        }

        // handle callback from the authorization, doing the user lookup if valid
        function handleAuthorizeCallback(authResult) {
            if (authResult && !authResult.error) {
                //save the token and do the user lookup
                oauthToken = authResult.access_token;
                getGoogleUserDetails();
            }
        }

        // lookup user details, prompting for authentication/permission if needed
        function getGoogleUserDetails() {
            if (oauthToken == null) {
                //authenticate
                gapi.load('auth2', { 'callback': authorizeGoogleUser });
            }
            else {
                //already athenticated, so continue to do user lookup
                gapi.client.load('plus', 'v1', apiClientLoaded);
               }
        }

        function apiClientLoaded() {
//
// THIS IS THE PORTION THAT NEEDS REDESIGNED AS THIS CALL IS GOING AWAY
//

            gapi.client.plus.people.get({ userId: 'me' }).execute(handleGetUserResponse);
        }

        //do user lookup
        function handleGetUserResponse(resp) {
            if (resp && resp.emails.length > 0) {
                //get primary email address
                var primaryEmail;
                for (var i = 0; i < resp.emails.length; i++) {
                    if (resp.emails[i].type === 'account') primaryEmail = resp.emails[i].value;
                }

                //call server-side method to encrypt email and refresh page
                $.ajax({
                    type: "POST",
                    url: "OUR URL",
                    data: "{'emailAddress': '" + primaryEmail + "'}",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (retVal) {
                        if (retVal.d !== '') {
                            window.location.href = retVal.d;
                        }
                    }
                });
            }
        }

1 Ответ

0 голосов
/ 28 декабря 2018

Я переписал весь процесс, теперь он работает для всех браузеров, кроме IE.Будем благодарны за любые предложения относительно IE.К сожалению, IE на самом деле не выдает ошибку, он выполняет аутентификацию, но никогда не возвращается к слушателю.

<script type="text/javascript" src="https://apis.google.com/js/api.js" "></script>
<script type="text/javascript">
  var apiKey = 'our key;
  var discoveryDocs = ["https://people.googleapis.com/$discovery/rest?version=v1"];
  var clientId = 'our client id;
  var scopes = 'profile';

  function handleClientLoad() {
    // Load the API client and auth2 library
      gapi.load('client:auth2', initClient);
   }

    function initClient() {
    gapi.client.init({
        apiKey: apiKey,
        discoveryDocs: discoveryDocs,
        clientId: clientId,
        scope: scopes,
        'immediate': false
    }).then(function () {
      // Listen for sign-in state changes.
      gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);
    });
  }

  function updateSigninStatus(isSignedIn) {
    if (isSignedIn) {
                makeApiCall();
    }
  }

  function handleAuthClick() {
    // here is my current issue, need to see if the user is signed in or not
    var isSignedIn = gapi.auth2.getAuthInstance().isSignedIn.get();
    if (isSignedIn) {
        makeApiCall();
    }
    else {
    gapi.auth2.getAuthInstance().signIn();
    }
  }

  function makeApiCall() {
    // Load the API and make an API call.  Display the results on the screen.
    gapi.client.people.people.get({ 
      'resourceName': 'people/me',
      'requestMask.includeField': 'person.emailAddresses'
    }).then(function(resp) {
      var email = resp.result.emailAddresses[0].value;
      //call server-side method to encrypt email and refresh page
      $.ajax({
        type: "POST",
        url: "our url",
        data: "{'emailAddress': '" + email + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (retVal) {
            if (retVal.d !== '') {
                window.location.href = retVal.d;
            }
        }   
      });
    });
  }
</script>

<script type="text/javascript" async defer src="https://apis.google.com/js/api.js" 
  onload="this.onload=function(){};handleClientLoad()" 
  onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>

<asp:linkButton ID = "btnGoogle" runat="server" CssClass="LinkBtn BtnContainerVertical" Width="200px" CausesValidation="false" OnClientClick="handleAuthClick(); return false;" ><img src="../Images/google.png" class="LinkBtnIcon" style="height:20px" />Google Login</asp:linkButton>
...