所以我试图使用express和passportjs将facebook身份验证添加到我的ionic2应用程序中。除了在授权后将用户重定向到ionic2 app的最后部分之外,我几乎完成了它的工作。我的两个应用程序都在不同的端口上工作; ionic2在http://localhost:8100上运行,并为http://localhost:8000
上运行的后端内容表达应用程序这是我遵循的步骤:
然后在我在localhost:8000上运行的快速应用程序中,我添加了facebook身份验证策略,如https://github.com/jaredhanson/passport-facebook中显示的那样:
passport.use(new FacebookStrategy({
clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: "http://localhost:8000/auth/facebook/callback"
},
function(accessToken, refreshToken, profile, cb) {
User.findOrCreate({ facebookId: profile.id }, function (err, user) {
return cb(err, user);
});
}
));
app.get('/auth/facebook',
passport.authenticate('facebook'));
app.get('/auth/facebook/callback',
passport.authenticate('facebook', { failureRedirect: '/login' }),
function(req, res) {
// Successful authentication, redirect home.
res.redirect('/'); //how to redirect back to ionic app instead of /
});
所以现在每当用户点击ionic2 app上的facebook按钮时,它就会转到facebook身份验证页面,并且一旦成功验证它,就会按预期重定向回localhost:8000 / auth / facebook / callback,但我想重定向回离子应用程序我怎么解决这个问题?需要一些指导来解决这个问题。
答案 0 :(得分:0)
我不确定这是否是你需要的,但我能够打开一个处理facebook身份验证的新窗口。这在我的提供者下面完成:我的successRedirect看起来像这样:
public loginWithFacebook(callback : (data : any) => any){
this.callback = callback;
this.childWindow = this.nativeWindow.open(this.authEndpoint);
this.closeTimer = setInterval(() => {
if (this.childWindow.closed){
clearInterval(this.closeTimer);
this.childWindow = null;
this.closeTimer = null;
var passedJson = this.http.get(this.checkEndpoint).map(res => res.json());
passedJson.subscribe(data => {
this.callback(data);
});
}
}, 500);
}
检查窗口是否关闭。问题是我必须自动关闭它。我只是创建了一个html页面,成功重定向呈现关闭创建的新窗口。这是我的successRedirect
router.get('/api/auth/facebook/success', function (req, res) {
res.render('after-auth');
});
确保使用您的快速应用,您可以在app.js中设置视图引擎。
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');
您的观看次数/ after-auth.html应如下所示
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript">
window.close();
</script>
</body>
</html>
现在关闭新窗口。我仍然遇到的唯一问题是,当我尝试进行下一次调用时,会话似乎没有保存。 req.user
对我来说似乎是undefined