如何在 angular 客户端中处理 passport-facebook 回调?
how to handle passport-facebook callback in angular client?
我正在开发一个 MEAN 应用程序。我正在使用护照进行身份验证 - 本地、facebook 和 google 策略。
我正在使用 angularjs 客户端。所有路由都在客户端处理。我只使用服务器数据 api。
使用 passport-facebook 策略时,我根据 passport 文档在节点服务器上使用以下代码。
app.get('/auth/facebook',passport.authenticate('facebook-auth', { scope : ['email'] }));
app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', {
successRedirect : '/home',
failureRedirect : '/login',
scope:['email']
}));
我面临的问题是当用户点击 "Sign in using Facebook" 按钮时
<a href="/auth/facebook" class="btn"><i class="fa fa-facebook"></i> Sign in using Facebook</a>
客户端将访问“/auth/facebook”路由,该路由最终会将用户重定向到 Facebook 页面以验证用户的凭据。
验证成功后,用户将被重定向到 "successRedirect" 值中定义的路由“/home”。
现在的问题是,我想使用自定义回调函数而不是为成功或失败定义重定向。它将如下所示:
app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', function(err,user,info){
if(err){
throw err;
}
else if(user === 'userexists'){
res.json({
'state':false,
'message':'User with this e-mail already exists'
});
}
else{
req.logIn(user,function(loginErr){
if(loginErr){
throw loginErr;
}
res.json({
'state':true,
'message':'You logged in successfully!'
});
});
}
}));
我在这里面临的根本问题是,我不能使用上面的自定义回调,因为客户端没有调用 "auth/facebook/callback" 路由,它是由 facebook 调用的。
因此,没有成功处理程序等待在客户端捕获上述回调的响应!!
我想要一些方法在客户端以 json 形式获得响应,以消除服务器端重定向,以及在 facebook 成功验证后将消息和用户名传递给客户端的方法。
我要放弃护照了。希望在删除大量代码之前找到任何可能的解决方案!
谢谢
这可以通过重定向到 facebook 回调处理程序内的另一个端点来完成。无需对来自 facebook 的回调执行 res.json()
,因为他们仅向其发出请求,以便让您知道身份验证是失败还是成功。 From their docs:
// GET /auth/facebook/callback
// Use passport.authenticate() as route middleware to authenticate the
// request. If authentication fails, the user will be redirected back to the
// login page. Otherwise, the primary route function function will be called,
// which, in this example, will redirect the user to the home page.
所以当 facebook returns 调用 /auth/fb/callback
时,Facebook returns 将请求过程的控制权还给你,但接下来要做什么取决于你。因为一旦用户成功通过身份验证,您就可以在整个会话期间使用 req.user
。此时,您可以重定向到示例 /account
中的 have 并检查 req.user
是否为 req.isAuthenticated()
并完成您想要的流程。
我正在开发一个 MEAN 应用程序。我正在使用护照进行身份验证 - 本地、facebook 和 google 策略。
我正在使用 angularjs 客户端。所有路由都在客户端处理。我只使用服务器数据 api。
使用 passport-facebook 策略时,我根据 passport 文档在节点服务器上使用以下代码。
app.get('/auth/facebook',passport.authenticate('facebook-auth', { scope : ['email'] }));
app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', {
successRedirect : '/home',
failureRedirect : '/login',
scope:['email']
}));
我面临的问题是当用户点击 "Sign in using Facebook" 按钮时
<a href="/auth/facebook" class="btn"><i class="fa fa-facebook"></i> Sign in using Facebook</a>
客户端将访问“/auth/facebook”路由,该路由最终会将用户重定向到 Facebook 页面以验证用户的凭据。
验证成功后,用户将被重定向到 "successRedirect" 值中定义的路由“/home”。
现在的问题是,我想使用自定义回调函数而不是为成功或失败定义重定向。它将如下所示:
app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', function(err,user,info){
if(err){
throw err;
}
else if(user === 'userexists'){
res.json({
'state':false,
'message':'User with this e-mail already exists'
});
}
else{
req.logIn(user,function(loginErr){
if(loginErr){
throw loginErr;
}
res.json({
'state':true,
'message':'You logged in successfully!'
});
});
}
}));
我在这里面临的根本问题是,我不能使用上面的自定义回调,因为客户端没有调用 "auth/facebook/callback" 路由,它是由 facebook 调用的。 因此,没有成功处理程序等待在客户端捕获上述回调的响应!!
我想要一些方法在客户端以 json 形式获得响应,以消除服务器端重定向,以及在 facebook 成功验证后将消息和用户名传递给客户端的方法。
我要放弃护照了。希望在删除大量代码之前找到任何可能的解决方案!
谢谢
这可以通过重定向到 facebook 回调处理程序内的另一个端点来完成。无需对来自 facebook 的回调执行 res.json()
,因为他们仅向其发出请求,以便让您知道身份验证是失败还是成功。 From their docs:
// GET /auth/facebook/callback
// Use passport.authenticate() as route middleware to authenticate the
// request. If authentication fails, the user will be redirected back to the
// login page. Otherwise, the primary route function function will be called,
// which, in this example, will redirect the user to the home page.
所以当 facebook returns 调用 /auth/fb/callback
时,Facebook returns 将请求过程的控制权还给你,但接下来要做什么取决于你。因为一旦用户成功通过身份验证,您就可以在整个会话期间使用 req.user
。此时,您可以重定向到示例 /account
中的 have 并检查 req.user
是否为 req.isAuthenticated()
并完成您想要的流程。