PassportJS + RestAPI + SPA

我使用ExpressJS来构buildRestAPI,客户端是SPA,并且通过PassportJS支持通过Google / FaceBook / GitHub / …进行身份validation。 我的问题,从社交logincallback将返回到RestAPI或SPA? 如果系统返回到RestAPI,那么如何将redirect到SPA上的主页。 另一种情况是,如果系统callbackSPA,RestAPI如何从客户端接收和validation令牌。 请让我知道常用的方法。

谢谢,

您提供callbackURL到authentication服务,您决定是否处理通过SPA或API的路线。 Oauthauthentication(简化)有两个步骤。 github上的插图:

步骤1) https://github.com/login/oauth/authorize?client_id=*YOUR_CLIENT_ID*$redirect_uri=*YOUR_REDIRECT_URI*
打开一个popup对话框,请求用户授权您的应用程序,如果成功返回到您的redirect_uri查询参数?code = AUTHORIZATION_CODE

步骤2)您通过https://github.com/login/oauth/access_token将上述AUTHORIZATION_CODE换成长期访问令牌

在你的架构中,你应该在SPA中执行第1步,在其他api中执行第2步。 你应该依靠spa来从authentication提供者获得授权码,把它发送到你的其他API,让其余的API交换一个长期的访问令牌,把这个令牌保存到数据库,用它来检索用户信息或者做无论你想用它,然后login用户。

对于第1步,您只需要CLIENT_ID,对于第2步CLIENT_ID和CLIENT_SECRET,也可以通过仅将CLIENT_SECRET存储在服务器端来保证应用程序的安全。

由你的rest api处理callbackuri的问题是,callbackuri被authentication提供者(在本例中为github)而不是由你的SPA调用,因此你不能发送一个响应来redirect用户到主页。 这只有在你的模板和路由在服务器端处理的情况下才有效,我假设你的体系结构不是这种情况。

从文档中并不明显,但是当你在app.post('/login', passport.authenticate('github'),这样的路线上注册护照中间件时,中间件会检查'code'查询参数是否包含AUTHORIZATION_CODE,如果不是,则启动步骤1,如果是步骤2。

我使用相同的堆栈(expression,angular度,护照),并遵循这种方法。

我创build了一个button。

 <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 })); 

这段代码表明,如果你成功login,你将被redirect到angular路由(/#/ profile)redirect后,你将有一个cookie,它有一个名为connect.sid的标记,因为passportjs使用快速会话。

然后你可以检查用户是否通过这个中间件到处login

 // 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

如果遇到问题,请告诉我。