【问题标题】:Node.js/passport-Facebook authenticationNode.js/passport-Facebook 身份验证
【发布时间】:2015-03-16 22:38:48
【问题描述】:

我正在尝试使用护照(passport-facebook)身份验证中间件实现简单的 Facebook 登录集成。关于this documentation over here,我的 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

**** U P D A T E ****

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

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 问题。

【问题讨论】:

  • 很明显,您不能使用服务器上已在使用的端口。因此,当您选择一个不会出现“EADDRINUSE”错误的不同端口时,您是否会将新端口放入您尝试的 URL 中?另外,我不知道您为什么提到socket.io,因为我在任何地方都看不到任何socket.io 代码。无论如何,您首先需要让普通的 Web 服务器正常工作。另外,为什么要涉及另一个 Web 服务器?如果您使用的是 nodejs,它应该是您在此框中的一个 Web 服务器,除非您故意在同一主机上运行多个 Web 服务器,但在不同的端口上。
  • 我已阅读您的帖子。我不明白其中的几个部分,因此我问了一堆问题(你都不想回答)。只有一个服务器进程可以侦听给定端口。如果您在 8081 端口上已经有一个 Web 服务器,则不能在同一主机上创建另一个服务器来侦听同一端口。时期。这就是 TCP 的工作原理。特定端口上的传入流量流向一个且只有一个正在侦听该端口的进程。除此之外,您还有其他问题吗?

标签: node.js authentication express passport.js passport-facebook


【解决方案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 关闭会话。每次进行身份验证时,您都会收到一个新令牌。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-19
    • 2016-09-28
    • 2016-11-12
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2016-05-18
    • 2015-01-02
    相关资源
    最近更新 更多