PassportJS + RestAPI + SPA

时间:2016-06-01 02:26:53

标签: node.js rest express passport.js

我正在使用ExpressJS构建RestAPI,客户端是SPA,并支持通过PassportJS通过Google / FaceBook / GitHub / ...进行身份验证。我的问题,来自社交登录的回调将返回RestAPI或SPA?如果系统返回到RestAPI,如何在SPA上重定向到主页。另一种情况,如果系统回调SPA,RestAPI如何从客户端接收和验证令牌。请让我知道常见的方法。

谢谢,

2 个答案:

答案 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

将上述AUTHORIZATION_CODE替换为长期访问令牌

在您的架构中,您应该在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

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