OAuth2Client 应该按请求创建还是按用户缓存?

Posted

技术标签:

【中文标题】OAuth2Client 应该按请求创建还是按用户缓存?【英文标题】:should OAuth2Client be created per request or cached per user? 【发布时间】:2014-10-12 15:07:45 【问题描述】:

我正在使用 google api 客户端的节点版本。即:google-api-nodejs-client.

作为其中的一部分,我正在设置 oauth-flow(确切地说是 'google webserver' 流。)

作为身份验证的一部分,这包括执行以下调用:

 var oauth2Client = new OAuth2Client(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);

 oauth2Client.setCredentials(userSpecificTokens)

显然,第一个调用是特定于应用程序的,而第二个调用是特定于用户的。

在这种情况下,什么被认为是好的做法?要么:

    每个用户有 1 个oauth2Client 和缓存/保存令牌,并在每个请求上使用oauth2Client.setCredentials(userSpecificTokens) 注入它们。这实质上会为每个请求创建一个新的oauth2Client。 每个用户都有一个oauthClient,包括已经应用的oauth2Client.setCredentials(userSpecificTokens),它会在需要时创建并在之后缓存。

【问题讨论】:

你找到答案了吗?我现在正在一个项目中使用该库,并且对同样的事情感到好奇。 【参考方案1】:

我相信你的第一种方法是正确的

每个用户有 1 个 oauth2Client 和缓存/保存令牌,并在每个请求上使用 oauth2Client.setCredentials(userSpecificTokens) 注入它们。

但是,这条线是不正确的

这实质上会为每个请求创建一个新的 oauth2Client。

oauth2client 只创建一次,当您更新它时 - new OAuth2Client(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);

setCredentials() 只是交换存储在该 OAuth2Client 对象中的凭据。基本上,这意味着如果您采用第二种方法,您将不必要地拥有许多额外的实例化 OAuth2Client。唯一需要实例化“新”Oauth2Client 的时间是当您想要连接不同的令牌/密钥时。

将令牌存储在数据库或会话中并通过在客户端的单个实例上设置凭据来完全按照您所描述的那样重复使用它们是有点常见的。 (https://security.stackexchange.com/questions/72475/should-we-store-accesstoken-in-our-database-for-oauth2)

作为参考,文档提供了一些见解并基本上描述了您的第一种方法 - https://github.com/google/google-api-nodejs-client/#request-level-options

您可以为每个请求指定要使用的身份验证对象。每个请求还继承在服务级别和全局级别指定的选项。

【讨论】:

以上是关于OAuth2Client 应该按请求创建还是按用户缓存?的主要内容,如果未能解决你的问题,请参考以下文章

我应该按值还是按(右值)引用传递 std::function ?

10 秒后运行任务,除非用户按下按钮

ASP.NET Core - 尝试创建一个按 ID 删除多条记录的端点

复制赋值运算符应该通过 const 引用还是按值传递?

Jmeter请求元件之参数化txt

Jmeter请求元件之参数化txt