Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript OAuth1通过身份验证调用Khan Academy';使用Google应用程序脚本的s API_Javascript_Api_Oauth_Google Apps Script - Fatal编程技术网

Javascript OAuth1通过身份验证调用Khan Academy';使用Google应用程序脚本的s API

Javascript OAuth1通过身份验证调用Khan Academy';使用Google应用程序脚本的s API,javascript,api,oauth,google-apps-script,Javascript,Api,Oauth,Google Apps Script,我对编码相当陌生。我正在使用GoogleAppScript,它应该是基于javascript的,并且是一个用于管理OAuth1API身份验证的库。我正试图通过汗学院的认证。我从谷歌应用程序网站上得到的这个脚本在一定程度上有效。函数“listTweets”将我带到“else”分支,并记录url,将我带到Khan Academy,以授予脚本进行呼叫的权限。我接受并应该重新运行该函数,并以“if-then-else”语句的“then”分支结束。我只是一直被派到其他地方。有人知道什么给你吗?提前感谢您的

我对编码相当陌生。我正在使用GoogleAppScript,它应该是基于javascript的,并且是一个用于管理OAuth1API身份验证的库。我正试图通过汗学院的认证。我从谷歌应用程序网站上得到的这个脚本在一定程度上有效。函数“listTweets”将我带到“else”分支,并记录url,将我带到Khan Academy,以授予脚本进行呼叫的权限。我接受并应该重新运行该函数,并以“if-then-else”语句的“then”分支结束。我只是一直被派到其他地方。有人知道什么给你吗?提前感谢您的帮助

var CONSUMER_KEY='my KEY';
var CONSUMER_SECRET='我的秘密';
var PROJECT_KEY='my google PROJECT KEY';
函数listTweets(){
var service=getTwitterService();
if(service.hasAccess()){
var response=service.fetch('https://www.khanacademy.org//api/v1/user/exercises');
var tweets=JSON.parse(response.getContentText());
Logger.log(tweets);
}否则{
var authorizationUrl=service.authorization();
Logger.log('请访问以下URL,然后重新运行脚本:'+authorizationUrl);
}
}
函数getTwitterService(){
var service=OAuth1.createService('twitter');
service.setAccessTokenUrl('https://www.khanacademy.org/api/auth2/access_token')
service.setRequestTokenUrl('https://www.khanacademy.org/api/auth2/request_token')
service.setAuthorizationUrl('https://www.khanacademy.org/api/auth2/authorize')
service.setConsumerKey(消费者密钥);
setConsumerCret(消费者秘密);
服务。设置项目密钥(项目密钥);
setCallbackFunction('authCallback');
setPropertyStore(PropertiesService.getScriptProperties());
setOAuthVersion('1.0');
回程服务;
}
函数authCallback(请求){
var service=getTwitterService();
var isAuthorized=service.handleCallback(请求);
如果(未授权){
返回HtmlService.createHtmlOutput('成功!您可以关闭此页面');
}否则{
返回HtmlService.createHtmlOutput('Denied.youcanclosethispage');
}

}
我不熟悉这个特定的API,但是通读并查看,他们似乎希望在URL中传递OAuth参数,而不是授权标头


默认情况下,OAuth服务使用授权头,但这可能会被
service.setParamLocation('uri-query')
所覆盖。我能够重现并跟踪您的问题。有趣的是,它最终是一个单字符修复(在前面提到的
setParamLocation
fix之后):您只需要使用OAuth版本“1.0a”而不是“1.0”。OAuth版本1.0a更改了OAuth回调如何工作以修复安全问题的一些细节,我猜当使用OAuth 1.0a时,这个OAuth库只在request_令牌步骤中包含回调URL。KA API始终使用在request_令牌步骤中指定的回调,因此以前版本的应用程序脚本从未运行回调

下面是一些适合我的代码:

var CONSUMER_KEY = 'FILL ME IN';
var CONSUMER_SECRET = 'FILL ME IN';
var PROJECT_KEY = 'FILL ME IN';

function listExercises() {
  var service = getKhanAcademyService();
  if (service.hasAccess()) {
    var response = service.fetch('https://www.khanacademy.org/api/v1/user/exercises');
    var exercises = JSON.parse(response.getContentText());
    Logger.log(exercises);
  } else {
    var authorizationUrl = service.authorize();
    Logger.log('Please visit the following URL and then re-run the script: ' + authorizationUrl);
  }
}

function getKhanAcademyService() {
  var service = OAuth1.createService('khanAcademy');
  service.setAccessTokenUrl('https://www.khanacademy.org/api/auth2/access_token')
  service.setRequestTokenUrl('https://www.khanacademy.org/api/auth2/request_token')
  service.setAuthorizationUrl('https://www.khanacademy.org/api/auth2/authorize')
  service.setConsumerKey(CONSUMER_KEY);
  service.setConsumerSecret(CONSUMER_SECRET);
  service.setProjectKey(PROJECT_KEY);
  service.setCallbackFunction('authCallback');
  service.setPropertyStore(PropertiesService.getScriptProperties());
  service.setOAuthVersion('1.0a');
  service.setParamLocation('uri-query');
  return service;
}

function authCallback(request) {
  var service = getKhanAcademyService();
  var isAuthorized = service.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Success! You can close this page');
  } else {
    return HtmlService.createHtmlOutput('Denied. You can close this page');
  }
}

谢谢你谈论这个问题,我现在将尝试插入它,看看会发生什么。谢谢,这不太管用。我在构建服务对象的函数的最后一行插入了“service.setParamLocation('uri-query'),就在“return service;”之前如果您确认键值是正确的,则需要单步执行库的UrlFetch调用,并检查它们各自的结果是否正确。看,莫格斯达德,非常感谢。我的密钥是正确的,因为我实际上可以“接受”让我的脚本访问我的Khan Academy帐户信息。在我“接受”之后,我的api调用出现了一些问题。这个链接看起来很有希望。我真的需要看看我的剧本有什么进展。明天我将有机会完成它。谢谢这里有一些消息:Eric更新了,它现在支持两条腿的OAuth1。Alan,非常感谢。我试图用我的密钥运行你的脚本。我遇到了一个障碍。当我试图通过运行“getKhanAcademyService”来构建服务对象时,该脚本在函数var service=OAuth1.createService('khanAcademy')的第一行终止;错误是“OAuth1未定义”。我在寻找一些小的语法错误,因为在我的原始脚本中,语句var service=OAuth1.createService('twitter');没有发现任何错误。我找不到任何东西。非常感谢您在这方面的帮助。您需要添加OAuth1库作为依赖项。请看这里的说明:我觉得自己像个白痴。我忘了在我的新剧本上这么做。它就像一个符咒。非常感谢!