我的网页https://localhost:3000/#/login
和https://localhost:3000/#/new
正常工作,https://localhost:3000/#/new
有一个按钮,可以通过passportjs
进行Facebook登录。以下是相关代码:
在auth.js
:
module.exports = {
'facebookAuth': {
'clientID': '1416536398420xxx',
'clientSecret': '...',
'callbackURL': 'https://localhost:3000/#/auth/facebook/callback'
}
}
在passport.js
:
passport.use(new FacebookStrategy({
clientID: configAuth.facebookAuth.clientID,
clientSecret: configAuth.facebookAuth.clientSecret,
callbackURL: configAuth.facebookAuth.callbackURL
},
function (accessToken, refreshToken, profile, done) {
process.nextTick(function () {
User.findOne({ 'facebook.id': profile.id }, function (err, usr) {
if (err) return done(err);
if (user) return done(null, user);
else {
var newUser = new User();
newUser.facebook.id = profile.id;
newUser.facebook.token = accessToken;
newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName;
newUser.facebook.email = profile.emails[0].value;
newUser.save(function (err) {
if (err) throw err;
return done(null, newUser)
})
}
})
})
}
));
在index.js
:
router.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email'] }));
router.get('/auth/facebook/callback',
passport.authenticate('facebook', { successRedirect: '/login',
failureRedirect: '/login' }));
通过点击Facebook登录按钮,它会重定向到Facebook登录页面,输入用户名和密码后,地址变为https://localhost:3000/?code=AQCh9Q9KgZjL3TzTpyMW61gxcNZjN2vEgQAvr5r1k9-WxjwfmVzsPL9Txu-oTkP08MJXyvmJiGEt8zrgHGjLAbpg3SsvCGQEM1jdxwj4YUGL5dmUU3Xm7JZZfUOcCqaGuLSEFcfX-s62-X6uUuPS0D62wWzrAI-NK6gdvudl_JzWBK2O5ptdhGhN8PbbLytGpySEsIY8VVKaI55Tu6fjYA9v2R7Fp_7R2c4krdhA8Pp2A3Z9dQDpg42cZLzxuUtDVqxaPHFNZOufETiE23GxSCObjdq_oSmWkgAVOH1sa2EtPzjawohDZllNmNF-8iGLQQ0#/auth/facebook/callback
结果,它挂起;页面是空白的。
有谁知道我的路线有什么问题?
修改1:我刚刚添加了Valid OAuth redirect URIs
,但我仍然可以通过#/auth/facebook/callbak
完成网址。
答案 0 :(得分:2)
这就是查询params(搜索)和哈希工作的方式。
哈希参数不会传递给服务器,它对客户端很有用。并且查询优先于哈希。
您可以在浏览器中自行尝试。打开任何网页(我在这里假设localhost),并使用控制台强制在URL中使用查询参数,哈希参数
window.location.hash = 'someHash'
网址将更新为localhost/#someHash
现在做
window.location.search = 'someQueryParam=value'
请注意,网址更改为localhost/?someQueryParam=value#someHash
唯一可以实现此目的的方法是使用不带#
符号的路由器。哈希路由器只是客户端。
这与Facebook回拨网址或护照无关。
我希望这会有所帮助。
答案 1 :(得分:1)
您的路由器正在URL路径的根目录中查找/auth/facebook/callback
。我不知道为什么,但Facebook将其代码放在URL的根目录。
按如下方式更改路由器
router.get(/auth\/facebook\/callback$/,
passport.authenticate('facebook', { successRedirect: '/login',
failureRedirect: '/login' }));