【问题标题】:PassportJS + RestAPI +SPAPassport JS + Rest API +SPA
【发布时间】:2016-09-30 05:14:42
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: node.js rest express passport.js


    【解决方案1】:

    我使用了相同的堆栈(快递、角度、护照)并遵循了这种方法。

    我创建了一个按钮。

    <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,该 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

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

    【讨论】:

    • 谢谢,我试试
    【解决方案2】:

    您将回调 url 提供给身份验证服务,您决定是通过 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,让 rest 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 步。

    【讨论】:

    • 感谢 Marton,但是在第 2 步,SPA 将 token 发送回 rest api,rest api 如何验证它?因为我们可以使用 postman 将无效令牌发布到 rest api。
    • 我不确定我是否理解。哪个令牌以及为什么要验证它?
    猜你喜欢
    • 2020-07-30
    • 2014-02-17
    • 2016-04-26
    • 1970-01-01
    • 2017-01-29
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多