首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PassportJS + RestAPI +SPA

PassportJS + RestAPI +SPA
EN

Stack Overflow用户
提问于 2016-06-01 10:26:53
回答 2查看 2.8K关注 0票数 5

我正在使用ExpressJS来构建RestAPI,客户端是SPA,并支持通过谷歌/脸书/GitHub/...通过PassportJS。我的问题是,社交登录的回调是否会返回到RestAPI或SPA?如果系统返回RestAPI,如何重定向到SPA上的主页。另一种情况是,如果系统回调SPA,RestAPI如何接收和验证来自客户端的token。请告诉我常用的方法。

谢谢,

EN

回答 2

Stack Overflow用户

发布于 2016-06-13 21:45:58

向身份验证服务提供回调url后,您将决定是通过SPA还是API处理路由。Oauth身份验证(简化)分为两个步骤。github上的插图:

步骤1) https://github.com/login/oauth/authorize?client_id=*YOUR_CLIENT_ID*$redirect_uri=*YOUR_REDIRECT_URI*

打开一个弹出对话框,请求用户授权您的应用程序,如果成功,将返回带有查询参数?code=AUTHORIZATION_CODE的redirect_uri

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

在您的体系结构中,您应该在SPA中执行步骤1,在rest 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'),这样的路由上注册一个passport中间件时,中间件将检查“AUTHORIZATION_CODE”查询参数是否包含一个代码,如果不包含,它将开始第一步,如果是step2。

票数 7
EN

Stack Overflow用户

发布于 2016-09-06 16:55:58

我使用了相同的堆栈(express,angular,passport),并遵循了这种方法。

我创建了一个按钮。

代码语言:javascript
复制
<a href="/auth/facebook">Login with facebook</a>

另外,我有两条护照的路线。

代码语言:javascript
复制
    // 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路由(/#/profile),重定向后您将拥有一个名为connect.sid的cookie,因为passportjs使用express-session。

然后你就可以通过这个中间件来查看用户是否在任何地方登录

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37558446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档