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

问题描述 投票:1回答:1

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

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

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

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

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

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

访问帐户的另一种方法:

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

最佳/更好的做法是:

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

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

express authentication oauth-2.0 routing passport.js
1个回答
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)来访问数据/站点的不同方法。

再说一次,我不知道这是不是最好甚至是好的做法,但它解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.