3

尝试从node.js服务器获取 facebook access_token时出现此错误:

{"error":{"message":"(#803) 您请求的某些别名不存在:access_token","type":"OAuthException","code":803}}

以下是获取access_token的代码:

var options={
        host:'graph.facebook.com',      
        path:'oauth/access_token?client_id=MYAPPID&redirect_uri=http://127.0.0.1:8000/&client_secret=MYAPPSECRET&code=CODEOBTAINEDFROMFB'
}
http.get(options,function(res){
    res.on('data', function (chunk) {
        console.log('BODY: ' + chunk);
    });
});

从我的浏览器请求相同的 url 工作正常,我也得到了 access_token。这里的问题是什么?

更新 这可能是我在 node.js 中经历过的最有趣的事情。我已将上述代码更新为:

var http=require('http')
var options={
        host:'grah.facebook.com',       
        pathname:'/oauth/access_token',
        search:'client_id=MYAPPID&redirect_uri=http://127.0.0.1:8000/&client_secret=MYAPPSECRET&code=CODEOBTAINEDFROMFB'
}

http.request(options,function(res){
        console.log('http fb code')
         res.setEncoding('utf8');
    res.on('data', function (chunk) {
        console.log('BODY: '+chunk);
    });     
});

发生的事情是服务器抛出一个名为socket hang up的错误。我的网络连接(通过移动调制解调器连接的互联网)也立即中断!在谷歌搜索这个问题时,我发现很多类似的,但找不到完美的解决方案......

4

2 回答 2

2

HTTP 文档作为选项列出path,但指出:

options对准url.parse()

您应该在创建 URL 时使用pathname(和search用于查询字符串)而不是。path另请参阅URLnode.js 的文档

var options={
  host:'graph.facebook.com',      
  pathname:'oauth/access_token',
  search: 'client_id=MYAPPID&redirect_uri=http://127.0.0.1:8000/&client_secret=MYAPPSECRET&code=CODEOBTAINEDFROMFB'
}
http.get(options,function(res){
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

更新:
url.format()文档中对 URL 对象的描述中没有path作为选项列出,因此它可能仅由url.parse()

URL 上的节点文档指出:

path: 连接路径名和搜索。

于 2012-04-29T08:51:47.543 回答
0

问题在于http对象。Facebook 仅在使用client_secret请求时允许https。所以这可以按我的预期工作:

var options={
        host:'graph.facebook.com',      
        path:'/oauth/access_token?client_id=APPID&redirect_uri=http://127.0.0.1:8000/&client_secret=CLIENTSECRET&code=FBUSERCODE'
}       
var https=require('https'); 
https.get(options,function(res){
        console.log('http fb code')
         res.setEncoding('utf8');       
         res.on('data', function (chunk) {
                console.log('BODY: '+chunk);
        });
});         
于 2012-05-01T10:48:35.093 回答