Node.js Can';t使用OAuth2节点从Facebook获取扩展用户访问令牌

Node.js Can';t使用OAuth2节点从Facebook获取扩展用户访问令牌,node.js,facebook-graph-api,oauth-2.0,Node.js,Facebook Graph Api,Oauth 2.0,我将尝试使用Nodejs从OAuth2获取扩展用户访问令牌 实际上,程序(在浏览器上)会发送一条消息,其中包含: 使用standard express generator,我修改了index.js中的代码,如下所示: var express = require('express'); var request = require('request'); var OAuth2 = require('oauth').OAuth2; var router = express.Router(); var

我将尝试使用Nodejs从OAuth2获取扩展用户访问令牌 实际上,程序(在浏览器上)会发送一条消息,其中包含:

使用standard express generator,我修改了index.js中的代码,如下所示:

var express = require('express');
var request = require('request');
var OAuth2 = require('oauth').OAuth2;
var router = express.Router();

var oauth2 = new OAuth2("487932668044758",
    "0793918b3ab637b2096787e10643980a",
    "", "https://www.facebook.com/dialog/oauth",
    "https://graph.facebook.com/oauth/access_token",
    null);


/* GET home page. */
router.get('/', function(req, res, next) {
    res.render('index', {
        // title: 'Express'
    });
});

router.post('/userToken', function(req, res) {
    if (!req.body) {
        return
        res.sendStatus(400)
    }
    var uid = req.body.uid;
    var token = req.body.token;
    validate_uid_token(uid, token, res);
    console.log('req:', req.body);
    console.log("uid: ", uid);
    console.log('token: ', token);

    // res.send("okie");
});

router.get("/callback", function(req, res) {
    console.log('here..form callback');
    res.header('Access-Control-Allow-Origin', 'http://localhost3000');
    res.header('Access-Control-Allow-Origin', 'https://www.facebook.com/dialog/oauth');
    res.header('Access-Control-Allow-Origin', 'https://graph.facebook.com/oauth/access_token');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    if (req.error_reason) {
        res.send(req.error_reason);
    }
    if (req.query.code) {
        var loginCode = req.query.code;
        var redirect_uri = "/"; // Path_To_Be_Redirected_to_After_Verification
        // For eg. "/facebook/callback"
        oauth2.getOAuthAccessToken(loginCode, {
                grant_type: 'authorization_code',
                redirect_uri: redirect_uri
            },
            function(err, accessToken, refreshToken, params) {
                if (err) {
                    console.error(err);
                    res.send(err);
                    return;
                }
                var access_token = accessToken;
                console.log('access_token : ', access_token);
                // var expires = params.expires;
                // console.log('expires : ', expires);
                req.session.access_token = access_token;
                // req.session.expires = expires;
            }
        );
    }
    // res.send('okie');
});

function validate_uid_token(uid, token, res) {

    var redirect_uri = "http://localhost:3000" + "/callback";
    // For eg. "http://localhost:3000/facebook/callback"
    var params = {
        'redirect_uri': redirect_uri,
        'scope': 'user_about_me,publish_actions'
    };

    res.redirect(oauth2.getAuthorizeUrl(params));
}

module.exports = router;
单击错误消息中的url。浏览器抛出ma JSON消息作为

{"statusCode":400,"data":"{\"error\":{\"message\":\"redirect_uri isn't an absolute URI. Check RFC 3986.\",\"type\":\"OAuthException\",\"code\":191}}"}

有人能帮我吗…非常感谢..

我建议将Passport.js与
Passport-facebook
策略结合使用。这隐藏了大部分涉及的复杂性


您在代码中提到了两个不同的重定向uri。但应该有一个重定向uri。感谢@Tobi…但我必须避免passportjs,因为系统已经使用了JWT。他们正在使用无Cookie技术..:(…对不起,但是你当前使用JWT的代码在哪里?据我所知FB也没有发送JWT。我稍后将为我的web应用添加JWT。我的应用程序的这些步骤是:用户登录到应用程序。我通过javascript获取应用程序用户face令牌并将其发送到服务器。我将应用程序用户令牌扩展到long live令牌在本网站中遵循这些步骤
{"statusCode":400,"data":"{\"error\":{\"message\":\"redirect_uri isn't an absolute URI. Check RFC 3986.\",\"type\":\"OAuthException\",\"code\":191}}"}