是否有可能获得先前已提供授权的用户的OAuth2刷新令牌,而无需再次请求授权?
上下文
我有一个Google Apps脚本插件,已获得许多示波器的授权(包括在不存在时运行的功能 - 请参见下面的屏幕截图)。我正在扩展该项目,以包含一个需要访问相同范围的Google App Engine Web应用程序(不需要额外的范围)。我希望利用以前获得的现有范围,而无需再次请求它们。
能够在不存在时运行截图:
对是否有可能和最佳方法的任何指导表示赞赏。
答案 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()
}