Javascript 如何访问用户的谷歌日历并编辑它,而不需要一次又一次的用户许可

Javascript 如何访问用户的谷歌日历并编辑它,而不需要一次又一次的用户许可,javascript,google-calendar-api,google-api-js-client,Javascript,Google Calendar Api,Google Api Js Client,在我的网站上,我要求谷歌日历访问。我可以编辑用户日历,但我不想一次又一次地请求用户权限,因此,一旦用户授权并授予对谷歌日历的访问权,我可以随时编辑它,直到用户撤销访问。我应该在前端还是后端实现它?如何实现?我检查了一些答案,他们提到我们可以使用服务帐户,但不清楚如何编辑或读取单个用户的日历事件,以及在用户撤销访问后如何删除它。此问题已删除,因为缺少代码,所以在下面添加代码 我尝试过这样做,所以一旦用户登录,我就获得了访问令牌,我正在使用它 window.gapi.load("clien

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

我尝试过这样做,所以一旦用户登录,我就获得了访问令牌,我正在使用它

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) )
})

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

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

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

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

根据谷歌指南。您可以
发布到
https://oauth2.googleapis.com/token
。假设您的服务器端堆栈位于Node.js中,您可以使用HTTP客户端执行以下操作:

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

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

如果是(b),则需要以下信息:-

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

  • 所以你们想说在服务器上创建一个端点,接受oAuth并在那个里保存令牌?如何在令牌过期后刷新令牌?如何获取刷新令牌以保存在数据库中。我们可以在客户端生成吗?客户端无法获取令牌。您将获得一个OAuth代码,并将其交换为(1)访问令牌(2)刷新令牌。您可以将它们存储在数据库中,并定期刷新它们。看,上面有博客吗?我有一个疑问,在客户端还是服务器端,我应该向用户请求日历访问权限?对于服务器端,我如何将用户从客户端发送到服务器端,因为我们的用户将使用客户端web app。我共享的链接是Google提供的综合指南。:)
    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)