簡體   English   中英

Passport身份驗證回調掛起

[英]Passport authentication callback hangs

經過幾個小時試圖自己解決這個問題,我到了SO社區尋找一些亮點。

我正在使用護照進行用戶身份驗證。 它已根據文檔在我的主要express.js文件中初始化:

app.use(passport.initialize());

我有一個index.js文件以這種方式處理facebook-passport :Index.js

'use strict';

import express from 'express';
import passport from 'passport';
import auth from '../auth.service';
let router = express.Router();

//this function is defined in the auth.service import but copied it here in case it's needed (the `signToken` is also defined in the service)
function setTokenCookie(req, res) {
  if (!req.user) return res.json(404, { message: 'Something went wrong, please try again.'});
  var token = signToken(req.user._id, req.user.role);
  res.cookie('token', JSON.stringify(token));
  res.redirect('/');
}


router
  .get('/', passport.authenticate('facebook', {
    scope: ['email', 'user_about_me'],
    failureRedirect: '/login'
  }))

.get('/callback', passport.authenticate('facebook', {
  successRedirect: '/',
  failureRedirect: '/login'
}), setTokenCookie);

module.exports = router;

以這種方式在index.js中導入的passport.js:

passport.js

import passport from 'passport';
import {
  Strategy as FacebookStrategy
}
from 'passport-facebook';

exports.setup = function(User, config) {
  passport.use(new FacebookStrategy({
      clientID: config.facebook.clientID,
      clientSecret: config.facebook.clientSecret,
      callbackURL: config.facebook.callbackURL
    },
    function(accessToken, refreshToken, profile, done) {
      User.findOne({
        'facebook.id': profile.id
      }, (findErr, user) => {
        if (findErr) {
          return done(findErr);
        }
        if (!user) {
          let userToSave = new User({
            name: profile.displayName,
            email: profile.emails[0].value,
            role: 'user',
            username: profile.username,
            provider: 'facebook',
            facebook: profile._json
          });
          userToSave.save((saveErr) => {
            if (saveErr) done(saveErr);
            return done(null, user);
          });
        } else {
          return done(null, user);
        }
      });
    }
  ));
};

這是目前發生的事情:

  • Facebook登錄提示
  • 在Facebook成功驗證后,使用用戶信息和令牌按預期到達回調(/ auth / facebook / callback)。
  • 用戶使用預期字段保存在DB中

事情變得奇怪:

  • 保存用戶后, done(null,user)不執行任何操作。 應用程序掛起回調,客戶端一直等待響應。
  • 中間件setTokenCookie永遠不會被調用,因此問題肯定在上一步中。

我嘗試過的:

  • 在processes.tick中包裝來自passport.js的整個設置功能(發現有些人使用它但沒有解決問題)
  • User.findOne({...}).exec().then(user => {...})使用帶有promise的Mongoose User.findOne({...}).exec().then(user => {...})

如果您需要其他信息,請不要猶豫。 任何幫助都非常感謝。

謝謝!

我看到一些可能丟失的部分看了我的代碼。 你使用的是passport.session()中間件嗎? serializeUserdeserializeUser函數也是?

passport.serializeUser(function(user, done) {
  //place user's id in cookie
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  //retrieve user from database by id
  User.findById(id, function(err, user) {
    done(err, user);
  });
});

如果你是像我這樣的護照/快遞菜鳥,這可能會有所幫助:

檢查你是否在護照邏輯中調用done():

passport.use(new twitchStrategy({
    clientID: config.twitchID,
    clientSecret: config.twitchSecret,
    /*to be updated*/
    callbackURL: config.callbackURL,
    scope: "user_read"
  },
  function(accessToken, refreshToken, profile, done) {
    console.log(profile);
    ***return done();***
  }
));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM