2016-06-01 61 views
2

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

感谢,

回答

3

您提供的回调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步。

+0

感谢马顿,但在第2步,SPA发送令牌回休息API,如何休息API验证它?因为我们可以使用邮递员发布无效令牌来休息api。 –

+0

我不确定我是否理解。哪个令牌以及您为什么要验证它? – marton

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

如果您遇到问题,请让我知道。

+0

谢谢,我会试试看 –