针对不同访问方法的快速OAuth授权

时间:2017-12-30 22:31:00

标签: express authentication oauth-2.0 routing passport.js

我希望找出以下方案的最佳做法。我是一个相对较新/爱好的程序员。我正在开发一个使用Dialogflow的聊天机器人。我希望用户能够使用不同的消息传递应用程序来访问支持的数据库中的数据和信息,但我希望对用户进行身份验证(我需要知道他们是谁以查询相关数据)。我还有一个网站,用户可以在其中创建帐户并登录。

我创建了该网站,所有OAuth连接都正常运行。我正在存储有关帐户创建的信息,以便跟踪用户。

我遇到困难的是,我希望能够在消息传递平台上对用户进行身份验证,以链接到我们数据库中的帐户(令牌/某种简单的配置文件标识符)。

我正在寻找有关OAuth流和路由的建议。我正在使用Express。我们以Google帐户关联为例:

创建/访问帐户的一种方法:

网站 - >注册/登录 - >发送给Google - >确认身份 - >返回回叫(在网站的受保护区域内)。

访问帐户的另一种方式:

DialogFlow聊天 - >发送到webhook(我想保护此路线) - >验证/识别用户 - >查询数据 - >将信息返回给用户的设备。此过程需要访问与网站流程相同的流程。就像我现在一样,我的回调总是回到我网站的内部页面。但我想如果用户试图通过Google智能助理访问信息,我不希望这样。

最佳/更好的做法是:

  • 通过路由条件语句处理不同的流程?
  • 使用相同的帐户逻辑设置不同的路由端点(我使用的是passport.js),但是指定了不同的回调网址?
  • 使用不同的网址注册不同的API凭据以处理不同的访问方法?
  • 如何处理来自消息传递应用程序的回调?

在我的新手自我中,我是否过于复杂,是否有更简单,更优雅的解决方案?谢谢!

1 个答案:

答案 0 :(得分:0)

我最终自己解决了这个问题。

我在这里查看了这个答案(Nodejs Passport - Using Multiple Google Strategies)。

对于那些需要/想要代码的人。

我的路线是:

// GOOGLE ROUTER

  //process route to verification
    router.get('/google', passport.authenticate('google', { scope : ['profile', 'email'] }));

  //callback after verification
    router.get('/google/callback', passport.authenticate('google', {
        successRedirect : '/profile',
        failureRedirect : '/'
    }));

// DIALOGFLOW ROUTER
   router.get('/auth', passport.authenticate('google-dialogflow', { scope : [ 'email'] }));

我在authenticate方法中添加了单独的name参数。

然后在passport.js文件中我有两个护照策略。一个开始于:

passport.use('google',new GoogleStrategy({
   clientID        : configAuth.googleAuth.clientID,
   clientSecret    : configAuth.googleAuth.clientSecret,
   callbackURL     : configAuth.googleAuth.callbackURL,
   passReqToCallback : true
},
function(req, token, refreshToken, profile, done) {...

另一个以:

开头
passport.use('google-dialogflow',new GoogleStrategy({
   clientID        : configAuth.dialogAuth.clientID,
   clientSecret    : configAuth.dialogAuth.clientSecret,
   callbackURL     : configAuth.dialogAuth.callbackURL,
   passReqToCallback : true 
},
function(req, token, refreshToken, profile, done) {...

我还在Google API控制台中创建了不同的凭据,以便我可以使用不同的凭据(clientID,clientSecret,callbackURl)来访问数据/网站的不同方法。

同样,我不知道这是不是最好甚至是好的做法,但它解决了我的问题。