【问题标题】:How can access google calendar of user and edit it without asking for user permisssion again and again如何在不要求用户许可的情况下访问用户的谷歌日历并对其进行编辑
【发布时间】:2020-11-27 10:10:20
【问题描述】:

在我的网站上,我要求访问谷歌日历。我可以编辑用户日历,但我不想一次又一次地请求用户许可,所以一旦用户授权并授予对谷歌日历的访问权限,我可以随时编辑它,直到用户撤销访问权限。我应该在前端还是后端实现它,如何实现?我检查了几个答案,他们提到我们可以使用服务帐户,但是不清楚如何编辑或阅读单个用户的日历事件,以及一旦用户撤销访问权限,我如何将其删除。此问题已删除,因为缺少代码,所以在下面添加代码。

我试过这个,所以一旦用户登录,我就会得到访问令牌并正在使用它

window.gapi.load("client:auth2", () => {
  window.gapi.client.setApiKey("api_key");
  window.gapi.client.load("https://content.googleapis.com/discovery/v1/apis/calendar/v3/rest")
  .then(() => {
    window.gapi.auth.setToken({ access_token: access_token })
    window.gapi.client.calendar.events.insert({
      "calendarId": "id",
      'resource': event
    }).then((res) => {
      console.log("calendar data res "+JSON.stringify(res))
    }).catch(err => console.log("error getting calendar data "+JSON.stringify(err)))
  }).catch(err => console.error("Error loading GAPI client for API", err) )
})

但是一旦访问令牌过期,我如何才能获得新的访问令牌(我不想一次又一次地向用户显示登录弹出窗口。我想知道如何在客户端使用刷新令牌来做到这一点) .

【问题讨论】:

    标签: javascript google-calendar-api google-api-js-client


    【解决方案1】:

    如果不向公众公开您的密钥,您将无法在客户端获取刷新令牌。

    您可以创建一个接受 oAuth 代码并返回令牌的端点,保存刷新令牌以备后用。您设置了一个玉米作业来检查过期令牌并刷新它们。

    每次用户访问您的应用时,您都会从服务器获取一个新的令牌并继续正常工作。

    根据 Google 指南。你做POSThttps://oauth2.googleapis.com/token。假设您的服务器端堆栈在 Node.js 中,您可以使用像 Axios 这样的 HTTP 客户端执行类似的操作:

    const Axios = require('axios');
    const Qs = require('querystring');
    
    const GOOGLE_CLIENT_ID = 'abc';
    const GOOGLE_CLIENT_SECRET = '123';
    
    let refreshToken = getFromDataBase(); // should be stored in database
    
    Axios.post('https://oauth2.googleapis.com/token', Qs.stringify({
        client_id: GOOGLE_CLIENT_ID,
        client_secret: GOOGLE_CLIENT_SECRET,
        refresh_token: refreshToken,
        grant_type: 'refresh_token'
    }), {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        }
    })
    .then(({ data }) => console.log(data.access_token)) // new token that expires in ~1 hour
    .catch(console.log)
    

    【讨论】:

    • 所以你想说在服务器上创建一个端点并接受 oAuth 并在那里保存令牌?令牌过期后如何刷新?
    • 如何获取刷新令牌以保存在数据库中。我们可以在客户端生成它吗?
    • 您无法在客户端获取令牌。您将获得一个 OAuth 代码,并将其交换为 (1) 访问令牌 (2) 刷新令牌。您将两者都存储在数据库中并定期刷新它们。见developers.google.com/identity/protocols/oauth2/web-server
    • 上面有博客吗?我有一个疑问,我应该在客户端还是服务器端向用户询问日历访问权限?在服务器端的情况下,我如何将用户从客户端发送到服务器端,因为我们的用户将使用客户端 Web 应用程序。
    • 我分享的链接是谷歌的综合指南。 :)
    【解决方案2】:

    首先,您是否 (a) 想要在用户未登录时更新日历,例如响应外部事件? ...或者...您 (b) 是否只想在浏览器会话中更新日历?

    如果 (a),那么您需要要求用户进行离线访问,这将为您提供一个 Refresh Token ,您可以将其安全地存储在服务器上并在需要时使用。 (忘记所有关于服务帐户的事情)。

    如果(b),那么您需要以下信息:-

    1. 当访问令牌过期时,再次请求访问,但添加标志prompt=none。这将为您提供一个新的访问令牌,而用户不会看到任何 UX。
    2. 在隐藏的 iframe 中执行此操作,以便它在后台发生并且对用户不可见。因此,您的 iframe 将始终拥有一个最新的访问令牌,它可以通过 localStoragepostMessage 与您的应用共享。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-11
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多