【问题标题】:How to obtain a Google oauth2 refresh token?如何获取 Google oauth2 刷新令牌?
【发布时间】:2018-02-27 02:00:50
【问题描述】:

以下代码使用 Google oauth2 机制来登录用户。我们需要在用户离线时处理用户日历的更新,因此我们最终需要“刷新令牌”。 grantOfflineAccess() 的结果是否返回刷新令牌(在下面,我可以看到 response.code 包含一个可能是刷新令牌的值)?

如何获取可用于(服务器端)的刷新令牌来创建新的访问密钥,以便离线访问用户的 Google 日历?

<script type="text/javascript">
    function handleClientLoad() {
        gapi.load('client:auth2', initClient);
    }

    function initClient() {
        gapi.client.init({
            apiKey: 'MY_API_KEY',
            clientId: 'MY_CLIENT_ID.apps.googleusercontent.com',
            discoveryDocs: ['https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest'],
            scope: 'https://www.googleapis.com/auth/calendar'
        }).then(function () {
            var GoogleAuth = gapi.auth2.getAuthInstance();
            GoogleAuth.signIn();
            GoogleAuth.grantOfflineAccess().then(function (response) {
                var refresh_token = response.code;
            });
        });
    }

</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>

【问题讨论】:

    标签: oauth-2.0 google-api google-calendar-api google-oauth


    【解决方案1】:

    您在从 JavaScript 中获取 刷新令牌 时遇到问题是有原因的。那是不可能的。

    JavaScript 是一种 客户端 编程语言,要使其工作,您必须将客户端 ID 和客户端密码与 刷新令牌 一起嵌入代码中。这对于在网页上查看源代码的任何人都是可见的。

    我想你知道为什么这可能是个坏主意。主要问题是gapi 不会返回它,而库只是没有这种能力(我没有尝试在原始 JavaScript 中查看如果我问得好,OAuth 服务器是否会返回它)。

    您需要切换到某种服务器端语言。我听说这可以用 Node.js 完成,但我自己没有尝试过。 Java、PHP、Python 也是有效的选项。

    【讨论】:

      【解决方案2】:

      基于此post,您应该在请求中包含特定的scopes。您的客户端配置应该有$client-&gt;setAccessType("offline");$client-&gt;setApprovalPrompt("force");

      允许访问后,您将收到一个访问代码,您可以用该代码交换访问令牌。返回的访问令牌是您需要保存在数据库中的访问令牌。稍后,如果用户需要使用日历服务,您只需使用已保存的访问令牌即可。

      这是一个示例代码:

      /*
       * @$accessToken - json encoded array (access token saved to database)
      */
      
      $client = new Google_Client();
      $client->setAuthConfig("client_secret.json");
      $client->addScope("https://www.googleapis.com/auth/calendar");
      
      $_SESSION["access_token"] = json_decode($accessToken, true);
      
      $client->setAccessToken($_SESSION['access_token']);
      $service = new Google_Service_Calendar($client);
      
      //REST OF THE PROCESS HERE
      

      【讨论】:

      • 我认为这是针对服务器端 PHP 的。我需要让用户从运行我们的应用程序的浏览器进行身份验证,然后在用户从我们的应用程序脱机时服务器端更新用户的日历。
      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 2012-06-29
      • 2013-10-01
      • 2018-06-23
      • 2016-08-03
      • 1970-01-01
      • 2017-05-29
      • 2019-06-18
      相关资源
      最近更新 更多