如何从用户使用gmail API注册后生成的响应中获取id_token?

时间:2018-06-27 09:38:09

标签: javascript google-api google-oauth gmail-api google-api-js-client

我正在使用Gmail API进行用户注册到我的应用程序。为了进行用户验证,我需要在用户注册后生成id_token。我正在记录以下对象,但在其中看不到id_token。

access_token:"xx"
authuser:"xx"
client_id:"xx"
cookie_policy:"xx"
expires_at:"xx"
expires_in:"xx"
issued_at:"xx"
login_hint:"xx"
response_type:"xx"
scope:"xx"
session_state:"xx"
status:"xx",
token_type: "xx"

以下是代码

const API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx';
var clientId = 'xxxxx-xxxx.apps.googleusercontent.com';

const scopes =
'https://www.googleapis.com/auth/plus.login '+'https://www.googleapis.com/auth/gmail.readonly '+
'https://www.googleapis.com/auth/gmail.send';


const script = document.createElement("script");
  script.src = "https://apis.google.com/js/client.js";

  script.async = true
  script.onload = () => {
    window.gapi.load('auth2', () => {
      window.gapi.client.setApiKey(API_KEY);
      window.setTimeout(checkAuth, 1);
    });
  }
 document.body.appendChild(script)

function checkAuth() {
  gapi.auth2.init({
    client_id: clientId,
    scope: scopes,
    immediate: true
  }, handleAuthResult);
}

function handleAuthClick() {
  gapi.auth2.init({
    client_id: clientId,
    scope: scopes,
    immediate: false
  }, handleAuthResult);
  return false;
}

function handleAuthResult(authResult) {
  if(authResult && !authResult.error) {
    loadGmailApi();
    console.log(authResult)
  } else {
    $('#authorize-button').on('click', function(){
      handleAuthClick();
   });
  }
}

function loadGmailApi() {
  gapi.client.load('gmail', 'v1', () => console.log('loaded'));
}

记录authResult给我上面提到的输出对象。您能否检查我想念的东西以及如何获取该id_token。我正在使用以下链接通过Gmail API发送电子邮件:https://www.sitepoint.com/mastering-your-inbox-with-gmail-javascript-api/

2 个答案:

答案 0 :(得分:1)

您没有正确登录客户端Js start

   <!DOCTYPE html>
<html>
  <head>
    <title>Gmail API Quickstart</title>
    <meta charset='utf-8' />
  </head>
  <body>
    <p>Gmail API Quickstart</p>

    <!--Add buttons to initiate auth sequence and sign out-->
    <button id="authorize-button" style="display: none;">Authorize</button>
    <button id="signout-button" style="display: none;">Sign Out</button>

    <pre id="content"></pre>

    <script type="text/javascript">
      // Client ID and API key from the Developer Console
      var CLIENT_ID = '<YOUR_CLIENT_ID>';

      // Array of API discovery doc URLs for APIs used by the quickstart
      var DISCOVERY_DOCS = ["https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest"];

      // Authorization scopes required by the API; multiple scopes can be
      // included, separated by spaces.
      var SCOPES = 'https://www.googleapis.com/auth/gmail.readonly';

      var authorizeButton = document.getElementById('authorize-button');
      var signoutButton = document.getElementById('signout-button');

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

      /**
       *  Initializes the API client library and sets up sign-in state
       *  listeners.
       */
      function initClient() {
        gapi.client.init({
          discoveryDocs: DISCOVERY_DOCS,
          clientId: CLIENT_ID,
          scope: SCOPES
        }).then(function () {
          // Listen for sign-in state changes.
          gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

          // Handle the initial sign-in state.
          updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
          authorizeButton.onclick = handleAuthClick;
          signoutButton.onclick = handleSignoutClick;
        });
      }

      /**
       *  Called when the signed in status changes, to update the UI
       *  appropriately. After a sign-in, the API is called.
       */
      function updateSigninStatus(isSignedIn) {
        if (isSignedIn) {
          authorizeButton.style.display = 'none';
          signoutButton.style.display = 'block';
          listLabels();
        } else {
          authorizeButton.style.display = 'block';
          signoutButton.style.display = 'none';
        }
      }

      /**
       *  Sign in the user upon button click.
       */
      function handleAuthClick(event) {
        gapi.auth2.getAuthInstance().signIn();
      }

      /**
       *  Sign out the user upon button click.
       */
      function handleSignoutClick(event) {
        gapi.auth2.getAuthInstance().signOut();
      }

      /**
       * Append a pre element to the body containing the given message
       * as its text node. Used to display the results of the API call.
       *
       * @param {string} message Text to be placed in pre element.
       */
      function appendPre(message) {
        var pre = document.getElementById('content');
        var textContent = document.createTextNode(message + '\n');
        pre.appendChild(textContent);
      }

      /**
       * Print all Labels in the authorized user's inbox. If no labels
       * are found an appropriate message is printed.
       */
      function listLabels() {
        gapi.client.gmail.users.labels.list({
          'userId': 'me'
        }).then(function(response) {
          var labels = response.result.labels;
          appendPre('Labels:');

          if (labels && labels.length > 0) {
            for (i = 0; i < labels.length; i++) {
              var label = labels[i];
              appendPre(label.name)
            }
          } else {
            appendPre('No Labels found.');
          }
        });
      }

    </script>

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

答案 1 :(得分:0)

要返回id_token,您需要启动和OpenID Connect流程,方法是将范围openid添加到授权请求中的范围列表中。