【问题标题】:Obtain OAuth2 refresh token from existing authorization从现有授权中获取 OAuth2 刷新令牌
【发布时间】:2020-10-30 18:13:03
【问题描述】:

是否有可能获得之前提供过授权的用户的 OAuth2 刷新令牌,而无需再次请求授权?

上下文:

我有一个 Google Apps 脚本插件,它已获得多个范围的授权(包括在它们不存在时运行的能力 - 请参见下面的屏幕截图)。我正在扩展该项目以包含一个需要访问相同范围的 Google App Engine Web 应用程序(不需要额外的范围)。我希望利用之前已授予的现有范围,而无需再次请求它们。

能够在他们不存在时运行截图:

感谢任何关于是否可行和最佳方法的指导。

【问题讨论】:

  • 嗨@beano,你解决了这个问题吗?
  • 我确实找到了解决方案。请在下面查看我的答案。我向 Romain Vialard(Form Publisher 的作者)询问了这个技巧:D

标签: google-apps-script google-oauth


【解决方案1】:

为了获得刷新令牌,您必须在用户进行身份验证时请求离线访问,这样会询问用户是否愿意让您的应用程序离线访问他们的数据。将其视为额外的权限范围。

如果您需要刷新令牌并且在您对用户进行身份验证时没有获得它,那么您将不得不再次请求身份验证。

【讨论】:

    【解决方案2】:

    您可以使用时间触发器每小时刷新一次令牌,然后将此令牌保存到您的数据库中(确保用户已授权您的脚本创建触发器)

    当你需要做一些需要用户授权的事情时,你只需要使用这个令牌而不需要询问用户

    例如:

    export const generateOAuthToken = () => {
      try {
        const user = Session.getEffectiveUser()
        let accessToken
        let error = ''
    
        try {
          accessToken = ScriptApp.getOAuthToken()
        } catch (err) {
          error = err.message
        }
    
        // Connect to database
        const db = connectDatabase()
    
        if (error === '') {
          // Generate new token and save to database
          // ... here
        } else {
          // Save the error to display to the user
        }
      } catch (err) {
        console.error(err)
      }
    }
    
    export const setupOAuthTrigger = () => {
      const form = FormApp.getActiveForm()
      const triggers = ScriptApp.getUserTriggers(form)
    
      // Create a new trigger if required; delete existing trigger if it is not needed.
      let existingTrigger = null
      for (let i = 0; i < triggers.length; i += 1) {
        if (triggers[i].getEventType() === ScriptApp.EventType.CLOCK) {
          existingTrigger = triggers[i]
          break
        }
      }
    
      // TODO: Optimize this later, at the moment it's for cleaning up trigger in case of error
      if (existingTrigger) {
        ScriptApp.deleteTrigger(existingTrigger)
      }
    
      // Trigger every hour
      ScriptApp.newTrigger('generateOAuthToken')
        .timeBased()
        .everyHours(1)
        .create()
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 2018-06-23
      • 2012-06-29
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 2013-11-19
      • 2018-09-19
      • 2016-12-10
      相关资源
      最近更新 更多