【问题标题】:Express OAuth Authorization for Different Access Methods针对不同访问方法的快速 OAuth 授权
【发布时间】:2018-06-10 19:53:11
【问题描述】:

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

我已经创建了网站,所有的 OAuth 连接都工作正常。我正在存储有关创建帐户的信息以跟踪用户。

我卡住的地方是,我希望能够在消息传递平台上对用户进行身份验证,以链接到他们在我的数据库中的帐户(令牌/某种简单的个人资料标识符)。

我正在寻找有关 OAuth 流程和路由的建议。我正在使用快递。我们以 Google Account Linking 为例:

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

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

另一种访问帐户的方式:

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

最好/更好的做法是:

  • 通过路由条件语句处理不同的流?
  • 使用相同的帐户逻辑(我使用的是 passport.js)设置不同的路由端点但指定不同的回调 url?
  • 用不同的url注册不同的API凭证来处理不同的访问方式?
  • 您如何处理来自消息应用程序内部的回调?

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

【问题讨论】:

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


    【解决方案1】:

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

    我在这里查看了这个 SO 答案 (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)来访问数据/站点的不同方式。

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

    【讨论】:

      猜你喜欢
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 2016-03-23
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      相关资源
      最近更新 更多