我正在使用ExpressJS构建RestAPI,客户端是SPA,并支持通过PassportJS通过Google / FaceBook / GitHub / ...进行身份验证。我的问题,来自社交登录的回调将返回RestAPI或SPA?如果系统返回到RestAPI,如何在SPA上重定向到主页。另一种情况,如果系统回调SPA,RestAPI如何从客户端接收和验证令牌。请让我知道常见的方法。
谢谢,
答案 0 :(得分:4)
您向身份验证服务提供回调网址,您可以决定是通过SPA还是API处理路由。 Oauth身份验证(简化)有两个步骤。 github上的插图:
第1步)https://github.com/login/oauth/authorize?client_id=*YOUR_CLIENT_ID*$redirect_uri=*YOUR_REDIRECT_URI*
如果成功返回带有查询参数的redirect_uri,打开一个请求用户授权应用程序的弹出对话框?code = AUTHORIZATION_CODE
步骤2)您通过https://github.com/login/oauth/access_token
在您的架构中,您应该在SPA中执行步骤1,在其余api中执行步骤2。您应该依赖spa来从身份验证提供程序获取授权代码,将其发送到您的rest api,让其余的api交换长期访问令牌,将该令牌保存到数据库,使用它来检索用户信息或执行无论你想要什么,然后登录用户。
对于步骤1,您只需要CLIENT_ID,对于步骤2 CLIENT_ID和CLIENT_SECRET,因此您可以通过仅在服务器端存储CLIENT_SECRET来保证应用程序的安全。
你的rest api处理回调uri的问题是,回调uri是由身份验证提供程序(在本例中为github)调用而不是由SPA调用,因此你不能发送响应将用户重定向到主页。这只有在您的模板和路由在服务器端处理时才有效,我认为这不是您架构中的情况。
从文档中看不出来,但是当您在app.post('/login',
passport.authenticate('github'),
之类的路线上注册护照中间件时,中间件会检查代码是否为'查询参数包含一个AUTHORIZATION_CODE,如果没有,它将启动第1步,如果是,则执行步骤2.
答案 1 :(得分:2)
我使用相同的堆栈(快递,角度,护照)并遵循该方法。
我创建了一个按钮。
<a href="/auth/facebook">Login with facebook</a>
我还有两条护照路线
// send to facebook to do the authentication
app.get('/auth/facebook', passport.authenticate('facebook', {scope: 'email'}));
// handle the callback after facebook has authenticated the user
app.get('/auth/facebook/callback', passport.authenticate('facebook', {
successRedirect: '/#/profile',
failureRedirect: '/' //Redirect Homepage
}));
此代码显示如果您成功登录,您将重定向到angular route(/#/ profile)重定向后,您将拥有一个cookie,其中包含名为connect.sid的令牌,因为passportjs使用express-session。
然后,您可以检查用户是否通过此中间件
随处登录// route middleware to ensure user is logged in
function isLoggedIn(req, res, next) {
if (req.isAuthenticated())
return next();
res.redirect(301, '/');
}
您可以查看包含上述代码的我的存储库。 https://github.com/AOnurOzcan/meanTest
如果您遇到问题,请告诉我。