0

我正在尝试使用护照(passport-facebook)身份验证中间件实现简单的 Facebook 登录集成。关于此处的此文档,我的server.js中有一些代码:

var express = require('express'),
    passport = require('passport'),
    FacebookStrategy = require('passport-facebook').Strategy,
    app = express();

// Facebook authentication:
passport.use(
    new FacebookStrategy({
        clientID: "fb client id here",
        clientSecret: "fb client secret key here",
        callbackURL: "http://localhost/web-apps/facebook-passport/auth/facebook/"
    },
    function(accessToken, refreshToken, profile, done) {
        console.log("auth is done!");
        done(null, profile);
    })
);

app.get('/web-apps/facebook-passport/auth/facebook', passport.authenticate('facebook'));

app.get(
    '/web-apps/facebook-passport/auth/facebook/',
    passport.authenticate('facebook', {
        successRedirect: '/',
        failureRedirect: '/login'
    })
);

app.get('/web-apps/facebook-passport/', function(req, res) {
    res.send('<a href="/web-apps/facebook-passport/auth/facebook">Login with Facebook</a>');
});

app.listen(80);

该代码基本上提供了一个链接,该链接应该导致 Facebook 身份验证 (/facebook/auth),向客户端请求许可,然后使用一些访问令牌和客户端的详细信息将用户重定向回我的页面。但是,当我运行我的服务器并尝试通过按我得到的链接来做到这一点时

passport.initialize() 中间件未使用

护照堆栈跟踪:

Error: passport.initialize() middleware not in use
    at IncomingMessage.req.login.req.logIn (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport\lib\http\request.js:44:34)
    at Strategy.strategy.success (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport\lib\middleware\authenticate.js:228:13)
    at verified (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:179:18)
    at Strategy.app.get.passport.authenticate.successRedirect [as _verify] (C:\xampp\htdocs\web-apps\facebook-passport\server.js:22:3)
    at C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:195:22
    at C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\lib\strategy.js:183:5
    at passBackControl (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:126:9)
    at IncomingMessage.<anonymous> (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7)
    at IncomingMessage.emit (events.js:117:20)
    at _stream_readable.js:944:16

我想我需要在app.configuration我的服务器端脚本中添加类似的东西,但是这些在 express 4.x 版本中已经消失了。我想知道我该如何解决这个问题?

我的节点包是:

-passport@0.2.1

-passport-facebook@1.03

-express@4.11.1

**** 更新 ****

我已将以下代码添加到我的脚本顶部,结果丢失了先前的错误消息:

app.use(bodyParser());

// Use the passport package in our application
app.use(passport.initialize());

// Create our Express router
var router = express.Router();

但是,我收到了这个新错误说

此授权码已被使用。

这是堆栈跟踪:

FacebookTokenError: This authorization code has been used.
    at Strategy.parseErrorResponse (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\lib\strategy.js:198:12)
    at Strategy.OAuth2Strategy._createOAuthError (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:345:16)
    at C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\lib\strategy.js:171:43
    at C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:177:18
    at passBackControl (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:124:9)
    at IncomingMessage.<anonymous> (C:\xampp\htdocs\web-apps\facebook-passport\node_modules\passport-facebook\node_modules\passport-oauth2\node_modules\oauth\lib\oauth2.js:143:7)
    at IncomingMessage.emit (events.js:117:20)
    at _stream_readable.js:944:16
    at process._tickCallback (node.js:442:13)

解决了:

URI 的问题。

4

1 回答 1

1

尝试在您的

app.get('/web-apps/facebook-passport/auth/facebook', passport.authenticate('facebook-signup', { session: false }));

代替

app.get('/web-apps/facebook-passport/auth/facebook', passport.authenticate('facebook'));

我认为问题在于 facebook 记录了您并返回了一个令牌,如果您不关闭会话,则 facebook 正在等待相同的令牌。在身份验证完成后,使用 {session: false} 会导致 facebook 关闭会话。每次进行身份验证时,您都会收到一个新令牌。

我以前遇到过这样的问题,我不是专家,但我也是这样解决的。

于 2016-09-09T16:39:04.173 回答