【问题标题】:NodeJS Facebook User Feed Subscriptions: Invalid OAuth access tokenNodeJS Facebook 用户订阅:无效的 OAuth 访问令牌
【发布时间】:2015-04-27 11:59:39
【问题描述】:

我快要崩溃了(作为一个热情的开发者,应该),所以希望我能在这方面得到一些帮助。在阅读了一堆论坛并筛选了 facebook 文档后,这里有一个尝试订阅用户提要的日志文件。我真的只需要知道我正在运行的底层 API 是否应该在理论上有效。这是我的日志:

*********************************************************
makeRequest - Host: graph.facebook.com - Path: /v2.2/{ app_id }/subscriptions?object=user
*********************************************************
Type: DELETE
*********************************************************
Wed Feb 25 2015 12:52:15 GMT+0000 (UTC) Server is listening on port 81
*********************************************************
makeRequest - Host: graph.facebook.com - Path: /oauth/access_token?client_id={ app_id }&client_secret={ app_secret }&grant_type=client_credentials
*********************************************************
Type: GET
*********************************************************
App Access Token: { app_token }
*********************************************************
makeRequest - Host: graph.facebook.com - Path: /v2.2/{ app_id }/subscriptions?&object=user&fields=feed&callback_url={ uri_encoded_ callback_url }&verify_token={ verify_token }&access_token={ app_token }
*********************************************************
Type: POST
*********************************************************
Success: {"error":{"message":"Invalid OAuth access token.","type":"OAuthException","code":190}}

所以在这里我首先尝试删除所有当前活动的订阅,然后使用 API 来获取新的应用程序访问令牌,最后进行新的订阅。这是我初始化整个过程的函数:

function subscribe_facebook(http,https) {
    var oauth_obj   = getOauthObj('facebook');

    // First Delete
    var url         = oauth_obj.subscription_url;
    var host        = splitUrl(url,"host");
    var path        = splitUrl(url,"path");

    path += "?object=user";

    makeRequest(http,host,path,80,'DELETE',function(ret){
        // Get App Access Token
        url         = oauth_obj.access_token_url;
        host        = splitUrl(url,"host");
        path        = splitUrl(url,"path");

        path    +=  "?client_id="       +   oauth_obj.app_id;
        path    +=  "&client_secret="   +   oauth_obj.app_secret;
        path    +=  "&grant_type=client_credentials";

        makeRequest(https,host,path,443,'GET',function(ret){
            facebook_app_token = ret.toString().split('|');
            facebook_app_token = facebook_app_token[1];
            consoleLogger("App Access Token: " + facebook_app_token);

            subscribe(https,'facebook',443,'POST',facebook_app_token,myServer);
        });
    });
}

这是它进入的订阅函数:

function subscribe(http,type,port,method,access_token,myServer) {
    var oauth_obj = getOauthObj(type);
    var sub_post_data = "";
    switch (type) {
        case "facebook":
            sub_post_data = 
                "&object="          +   "user"+
                "&fields="          +   "feed"+
                "&callback_url="    +   encodeURIComponent(myServer + "/" + type) +
                "&verify_token="    +   "*****" +
                "&access_token="    +   access_token
            break;
    }

    var host = splitUrl(oauth_obj.subscription_url,"host");
    var path = splitUrl(oauth_obj.subscription_url,"path");
    path += "?" + sub_post_data;

    makeRequest(http,host,path,port,method,function(ret) {
        consoleLogger("Success: " + ret);
    });
}

我制作了另一个函数来维护社交媒体变量:

function getOauthObj(type) {
    var obj = {};
    var authorize_url = "";
    var access_token_url = "";
    var request_token_url = "";
    var subscription_url = "";

    var app_id = "";
    var app_secret = "";

    var main_domain = "";
    var scope = "";

    switch (type) {
        case "facebook":
            app_id      = '*****';
            app_secret  = '**********';

            main_domain         = 'https://graph.facebook.com/';
            authorize_url       = 'https://www.facebook.com/dialog/oauth';
            access_token_url    = main_domain + 'oauth/access_token';
            request_token_url   = main_domain + '2.2/me';
            subscription_url    = main_domain + "v2.2/" + app_id + "/subscriptions";
            scope               = 'read_stream';
            break;
    }
    obj.main_domain         = main_domain;

    obj.authorize_url       = authorize_url;
    obj.access_token_url    = access_token_url;
    obj.request_token_url   = request_token_url;
    obj.subscription_url    = subscription_url;

    obj.app_id              = app_id;
    obj.app_secret          = app_secret;

    return obj;
}

由于 OAuth 无效,我假设我没有将正确的参数传递给 oauth API 来执行此操作 - 有人可以引导我朝着正确的方向前进吗?

【问题讨论】:

  • 你还应该添加实际问题是什么... 分别显示一些代码。该错误显然表明 App Access Token 无效。
  • @Tobi - 是的,我现在可以用一些代码更新它,但我认为明显的问题在于我获取和使用 API 的顺序。以前,我不知道首先获取应用程序访问令牌的要求,最终只尝试使用用户的访问令牌进行订阅(对于 object=user&fields=feed)。是的,错误显然表明 OAuth 令牌无效,但对此的两部分问题是为什么,以及它指的是哪个令牌;这是否意味着刚刚发布的应用访问令牌(?)。

标签: node.js facebook oauth


【解决方案1】:

好的,现在已经解决了。我在一些论坛上阅读了有关不同 Facebook API 的详细信息,这些详细信息使用应用程序 ID,与管道连接,然后可以使用应用程序机密代替访问令牌,但我不认为这可以在这里使用,但是原来可以!

*********************************************************
makeRequest - Host: graph.facebook.com - Path: /v2.2/{ app_id }/subscriptions?&object=user&fields=feed&callback_url={ callback_url }&verify_token={ verify_token }&access_token={ app_id }|{ app_secret }

希望这对某人有所帮助。

干杯。

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2018-09-24
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多