获取用户的Google日历的权限,以便从服务器使用它们

时间:2018-06-09 19:32:38

标签: node.js google-api google-calendar-api google-oauth google-api-nodejs-client

要求

我必须开发以下功能:用户点击我网站上的按钮,然后弹出一个谷歌对话框,询问我的应用程序的日历权限。如果用户接受了 - 我的服务器应用程序(让我们说NodeJS)应该能够随时读取他的事件(不仅仅是30天)。

以下是我尝试过的内容

我正在关注这些教程(NodeJS和浏览器)https://developers.google.com/calendar/quickstart/nodejs

NodeJS教程为我提供了帐户权限(我需要用户为其帐户授予权限。)

浏览器教程弹出对话框并询问权限。如果用户接受了请求,那么它最终只能在日历上获得1小时的权限(因此,即使我可以使用来自我的服务器的令牌,它也无法解决问题)。要检查它只是尝试通过稍微修改来打印来自handleAuthClick的Promise的结果

gapi.auth2.getAuthInstance().signIn().then(res => {console.log(res)});

查看打印结果中的expires_in(或expires_at):

{
  "El": "117770076845340691060",
  "Zi": {
    "token_type": "Bearer",
    "access_token": "ya29.Glb...zr8Yx",
    "scope": "https://www.googleapis.com/auth/calendar https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email openid email profile",
    "login_hint": "AJDLj...WlQ",
    "expires_in": 3600,
    "id_token": "eyJhvGciO...sHxw6HcA",
    "session_state": {
      "extraQueryParams": {
        "authuser": "1"
      }
    },
    "first_issued_at": 1528384733411,
    "expires_at": 1528388333411,
    "idpId": "google"
  },
  "w3": {
    "Eea": "117770076845340691060",
    "ig": "Bryan Gray",
    "ofa": "Bryan",
    "wea": "Gray",
    "Paa": "https://lh3.googleusercontent.com/-zQ8KN1XZtJI/AAAAAAAAAAI/AAAAAAAAAAA/AB...e/s96-c/photo.jpg",
    "U3": "alex@khealth.ai"
  }
}

1 个答案:

答案 0 :(得分:1)

访问令牌只能在一小时内使用,您需要一个刷新令牌,这样您就可以在需要时请求新的访问令牌。为此,您需要请求离线访问。

 gapi.signin2.render('glogin', {
                'class': 'g-signin',
                redirect_uri: 'postmessage',
                onsuccess: signInCallback,
                cookiepolicy: 'single_host_origin',
                accesstype: 'offline',
                theme: 'dark'
            });

此示例中的代码Google oauth2