如何动态配置Passportjs策略?

6

我正在尝试使用护照(Passport)并通过以下方式配置我的 Twitter 登录:

passport.use(new TwitterStrategy({
    consumerKey: '*****',
    consumerSecret: '*****',
    callbackURL: "http://blabla/callback"
  },
  function(token, tokenSecret, profile, done) {
    done(null, profile)
  }
));

我希望能够在运行时基于已登录的用户配置这些值:(consumerKey,consumerSecret,callbackURL)。也就是说,每个用户都将拥有他们自己的Twitter应用程序,并需要在Twitter上注册。
有什么建议吗?

你是否有多个 Twitter 的 API 密钥/密钥? - onuriltan
我也有一个类似的问题,我的单个应用程序是多租户的,因此连接到多个谷歌、Facebook、Twitter 应用程序。 - pupeno
是的,我所遇到的情况和问题描述中的情况都是当您拥有多个Twitter应用程序时。例如,同一个节点应用程序是一个CMS,为Linux.com和freebsd.com提供服务,人们可以登录到任何一个网站,并且每个网站都有自己的Twitter应用程序。这是相当正常的多租户情况。 - pupeno
@pupeno 我认为你的情况有点不同。你有一定数量的密钥/秘钥对,对吧?但我仍然不太明白你如何分离你的应用程序。在Linux.com和freebsd.com的情况下,它们可能是独立的实例,并且不一定需要动态加载密钥/秘钥。那么在你的情况下,你如何知道要使用哪组密钥/秘钥对呢?身份验证路径是否不同? - thammada.ts
我不理解的是,用户尚未登录,那么您如何知道用户需要从另一个Twitter应用程序进行身份验证而无需登录?我的意思是,在登录之前是否有一个参数来确定这种情况? - onuriltan
显示剩余5条评论
2个回答

15

不必事先使用passport.use()注册策略,可以直接将策略传递给authenticate()(而不是传递策略名称)。

例如:

function login(req, res, next) {
  var user = req.user;
  var consumerKey = getConsumerKeyForUser(user);
  // Create a strategy instance specifically for this user.
  var strategy = new TwitterStrategy({ consumerKey: consumerKey }, ...);
  // Authenticate using the user-specific strategy
  passport.authenticate(strategy)(req, res, next);
}

关于这种技术的更多信息可以在此处找到:https://medium.com/passportjs/authenticate-using-strategy-instances-49e58d96ec8c


这似乎是有效的。TypeScript中该函数的类型不接受策略,因此我将为此提交错误报告。 - pupeno

-2

您需要使用您自己的消费者密钥和消费者密钥,而不是您用户的密钥。然后,您的应用程序将能够使用Twitter对您的用户进行身份验证。但是这些密钥和密码用于将您的应用程序与Twitter API进行身份验证。

请参考此示例项目:


这不是我询问的内容,也不是普通的应用程序,而是用于验证各种应用程序的代理。我希望每个用户都能提供其秘密/appId 并使用它们。在我的应用程序中验证用户的情况下,我知道它是如何工作的。 - ciaoben
@ciaoben 然后只需将用户提供的值用作 TwitterStrategy 构造函数的参数即可。请记住,您需要为每个客户保留一个 TwitterStrategy 对象和一个 passport 中间件实例。他们需要向您提供这些值,我认为这可能是最困难的部分。确保不违反 Twitter API TOC。 - rsp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接