从现有授权中获取OAuth2刷新令牌

时间:2018-04-17 12:40:35

标签: google-apps-script google-oauth google-oauth2

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

上下文

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

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

enter image description here

对是否有可能和最佳方法的任何指导表示赞赏。

2 个答案:

答案 0 :(得分:1)

要获取刷新令牌,您必须在用户通过此方式进行身份验证时请求脱机访问,并询问用户是否愿意让您的应用程序对其数据进行脱机访问。将其视为额外的权限范围。

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

答案 1 :(得分:0)

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

每当需要执行需要用户授权的操作时,只需使用此令牌而无需询问用户

例如:

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