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

时间:2014-08-19 13:30:33

标签: node.js oauth-2.0 google-oauth google-api-nodejs-client

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

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

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

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

 oauth2Client.setCredentials(userSpecificTokens)

显然,第一个呼叫是特定于应用的,而第二个呼叫是特定于用户的。

在这种情况下,什么是良好做法?要么:

  1. 每个用户拥有1个oauth2Client和缓存/保存令牌,并在每个请求上使用oauth2Client.setCredentials(userSpecificTokens)注入它们。这基本上会为每个请求创建一个新的oauth2Client
  2. 每个用户都有一个oauthClient,其中已经应用了oauth2Client.setCredentials(userSpecificTokens),这是在需要时创建的,之后会进行缓存。

1 个答案:

答案 0 :(得分:2)

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

  

每个用户有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

  

您可以指定每个请求使用的auth对象。每个请求还继承了在服务级别和全局级别指定的选项。