首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js/护照-Facebook身份验证

Node.js/护照-Facebook身份验证
EN

Stack Overflow用户
提问于 2015-01-18 23:14:04
回答 1查看 1.5K关注 0票数 0

我试图实现一个简单的Facebook登录集成使用护照(护照-facebook)认证中间件。关于这里的文件,我在这里有一些server.js的代码

代码语言:javascript
复制
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()中间件未使用

护照堆栈跟踪:

代码语言:javascript
复制
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的内容,但是这些都在快递4.x版本中消失了。我在想我怎么才能解决这个问题?

我的节点包是:

-passport@0.2.1 -护照-facebook@1.03 -express@4.11.1

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

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

代码语言:javascript
复制
app.use(bodyParser());

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

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

然而,我发现了一个新的错误

此授权代码已被使用。

这是堆栈跟踪:

代码语言:javascript
复制
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)

解决:

乌里斯的问题。

EN

回答 1

Stack Overflow用户

发布于 2016-09-09 16:39:04

试着在你的

代码语言:javascript
复制
app.get('/web-apps/facebook-passport/auth/facebook', passport.authenticate('facebook-signup', { session: false }));

而不是

代码语言:javascript
复制
app.get('/web-apps/facebook-passport/auth/facebook', passport.authenticate('facebook'));

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28015906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档