将 OAuth 与 StackExchange API 和 Apps 脚本结合使用时出现授权问题
Trouble authorizing using OAuth with StackExchange API and Apps Script
我正在尝试访问 StackExchange API,在 Google Apps 脚本中使用 OAuth。我正在使用 this library.
当我调用下面的方法时,一开始我没有访问权限(这是预期的)。我登录的权限URL是:
https://whosebug.com/oauth?client_id=14205&response_type=code&redirect_uri={URI}&state={STATE}&scope=read_inbox
将授权URL粘贴到我的浏览器中,我得到如下页面:
"Error: Token response not valid JSON: SyntaxError: Unexpected token: a (line 532, file "Service", project "OAuth2")"
我 运行 来自 Apps 脚本的内容:
function getMentions() {
var service = getStackExchangeService_();
Logger.log(service.hasAccess());
if (service.hasAccess()) {
//get token and call API
}
else {
Logger.log("App has no access yet.");
// open this url to gain authorization from Stack Exchange
var authorizationUrl = service.getAuthorizationUrl();
Logger.log("Open the following URL and re-run the script: %s",
authorizationUrl);
}
}
我的 Oauth.gs 页面:
function getStackExchangeService_() {
var CLIENT_ID = PropertiesService.getScriptProperties().getProperty('SE_CLIENT_ID');
var CLIENT_SECRET = PropertiesService.getScriptProperties().getProperty('SE_CLIENT_SECRET');
return OAuth2.createService('StackExchange')
.setAuthorizationBaseUrl('https://whosebug.com/oauth')
.setTokenUrl('https://whosebug.com/oauth/access_token')
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setCallbackFunction('authCallbackSE')
.setPropertyStore(PropertiesService.getUserProperties())
.setRedirectUri('https://script.google.com/macros/d/{SCRIPT ID}/usercallback')
.setScope('read_inbox');
}
function authCallbackSE(request) {
var SEService = getStackExchangeService_();
var isAuthorized = SEService.handleCallback(request);
if (isAuthorized) {
return HtmlService.createHtmlOutput('Success! You can close this tab.');
} else {
return HtmlService.createHtmlOutput('Denied. You can close this tab');
}
}
不清楚我哪里出错了,但我认为当我输入授权时我应该被重定向到授权页面URL。谢谢!
问题:
Stackexchange API,默认情况下将访问令牌发送为 application/x-www-form-urlencoded
,OAuth2 库的 tokenFormat 默认需要 JSON。
解决方案:
通过将 tokenUrl 设置为 https://whosebug.com/oauth/access_token/json
或
明确请求 JSON 的 api
在 OAuth2 库中显式设置 tokenFormat 以形成使用 setTokenFormat(TOKEN_FORMAT.FORM_URL_ENCODED)
编码的 url
参考文献:
我正在尝试访问 StackExchange API,在 Google Apps 脚本中使用 OAuth。我正在使用 this library.
当我调用下面的方法时,一开始我没有访问权限(这是预期的)。我登录的权限URL是:
https://whosebug.com/oauth?client_id=14205&response_type=code&redirect_uri={URI}&state={STATE}&scope=read_inbox
将授权URL粘贴到我的浏览器中,我得到如下页面:
"Error: Token response not valid JSON: SyntaxError: Unexpected token: a (line 532, file "Service", project "OAuth2")"
我 运行 来自 Apps 脚本的内容:
function getMentions() {
var service = getStackExchangeService_();
Logger.log(service.hasAccess());
if (service.hasAccess()) {
//get token and call API
}
else {
Logger.log("App has no access yet.");
// open this url to gain authorization from Stack Exchange
var authorizationUrl = service.getAuthorizationUrl();
Logger.log("Open the following URL and re-run the script: %s",
authorizationUrl);
}
}
我的 Oauth.gs 页面:
function getStackExchangeService_() {
var CLIENT_ID = PropertiesService.getScriptProperties().getProperty('SE_CLIENT_ID');
var CLIENT_SECRET = PropertiesService.getScriptProperties().getProperty('SE_CLIENT_SECRET');
return OAuth2.createService('StackExchange')
.setAuthorizationBaseUrl('https://whosebug.com/oauth')
.setTokenUrl('https://whosebug.com/oauth/access_token')
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setCallbackFunction('authCallbackSE')
.setPropertyStore(PropertiesService.getUserProperties())
.setRedirectUri('https://script.google.com/macros/d/{SCRIPT ID}/usercallback')
.setScope('read_inbox');
}
function authCallbackSE(request) {
var SEService = getStackExchangeService_();
var isAuthorized = SEService.handleCallback(request);
if (isAuthorized) {
return HtmlService.createHtmlOutput('Success! You can close this tab.');
} else {
return HtmlService.createHtmlOutput('Denied. You can close this tab');
}
}
不清楚我哪里出错了,但我认为当我输入授权时我应该被重定向到授权页面URL。谢谢!
问题:
Stackexchange API,默认情况下将访问令牌发送为 application/x-www-form-urlencoded
,OAuth2 库的 tokenFormat 默认需要 JSON。
解决方案:
通过将 tokenUrl 设置为
明确请求 JSON 的 apihttps://whosebug.com/oauth/access_token/json
或在 OAuth2 库中显式设置 tokenFormat 以形成使用
编码的 urlsetTokenFormat(TOKEN_FORMAT.FORM_URL_ENCODED)