我使用ExpressJS来构建RestAPI,客户端是SPA,并且通过PassportJS支持Google/FaceBook/GitHub/...进行身份验证。我的问题,从社交登录回调将返回到RestAPI或SPA?如果系统返回到RestAPI,那么如何将SPA重定向到主页。另一种情况是,如果系统回调SPA,RestAPI如何从客户端接收和验证令牌。请让我知道常用的方法。PassportJS + RestAPI + SPA
感谢,
我使用ExpressJS来构建RestAPI,客户端是SPA,并且通过PassportJS支持Google/FaceBook/GitHub/...进行身份验证。我的问题,从社交登录回调将返回到RestAPI或SPA?如果系统返回到RestAPI,那么如何将SPA重定向到主页。另一种情况是,如果系统回调SPA,RestAPI如何从客户端接收和验证令牌。请让我知道常用的方法。PassportJS + RestAPI + SPA
感谢,
您提供的回调URL到验证服务,您决定是否处理由SPA或API的路线。 Oauth认证(简化)有两个步骤。在GitHub上插图:
步骤1)https://github.com/login/oauth/authorize?client_id=*YOUR_CLIENT_ID*$redirect_uri=*YOUR_REDIRECT_URI*
打开,要求用户授权您的应用程序一个弹出式对话框,如果成功返回到您的REDIRECT_URI与查询参数代码= AUTHORIZATION_CODE
步骤2)?您通过
将上述AUTHORIZATION_CODE交换为长期访问令牌在您的架构中,您应该在SPA中执行第1步,在其他api中执行第2步。您应该依靠spa从认证服务提供商获取授权代码,将其发送给您的其余api,让其余api交换长期访问令牌,将该令牌保存到数据库,使用它来检索用户信息或执行无论你想用它,然后登录用户。
对于第1步,您只需要CLIENT_ID,对于第2步CLIENT_ID和CLIENT_SECRET,以便您可以通过仅将CLIENT_SECRET存储在服务器端来保持应用程序的安全。
由你的rest api处理回调uri的问题在于,回调uri被验证提供者(在本例中为github)而不是由你的SPA调用,因此你不能发送重定向响应用户转到主页。这只有在您的模板和路由在服务器端进行处理时才有效,我认为在您的体系结构中并非如此。
从文档中并不明显,但是当您在类似app.post('/login', passport.authenticate('github'),
的路由上注册护照中间件时,中间件会检查'code'查询参数是否包含AUTHORIZATION_CODE,如果不是,则它会启动步骤1,如果是第2步。
我使用了相同的堆栈(express,angular,passport)并遵循该方法。
我创建了一个按钮。
<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
}));
两条路线这段代码表明,如果你成功登录,你会重定向到角航线(/#/配置文件)重定向后你就会有一个cookie其中有一个名为connect.sid的令牌,因为passportjs使用快速会话。
然后你就可以检查用户是否在到处登录该中间件
// 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
如果您遇到问题,请让我知道。
谢谢,我会试试看 –
感谢马顿,但在第2步,SPA发送令牌回休息API,如何休息API验证它?因为我们可以使用邮递员发布无效令牌来休息api。 –
我不确定我是否理解。哪个令牌以及您为什么要验证它? – marton