Google API Oauth2:所有用户只能使用一个刷新令牌吗?

Ssj*_*sty 15 c# google-api google-analytics-api google-api-dotnet-client google-oauth2

我正在使用OAuth2身份验证,我有一个拥有多个用户的CMS,每个用户都有自己的配置文件.我们公司的Google帐户可以访问多个Google Analytics帐户.对于使用CMS的每个用户,我使用不同的用户名连接到Google AnalyticsAPI,每个用户的令牌都保存在数据库数据存储中.问题是,如果一个用户断开连接并撤消其令牌,则使用相同Google帐户的其他任何用户都无法访问Analytics API,这没有任何意义.

在此输入图像描述

编辑:经过进一步调查,我发现当第一个用户进行身份验证时,保存在数据存储中的令牌包含'refresh_roken'和'access_token'.但是,当其他用户进行身份验证时(他们使用相同的Google帐户,但使用不同的Google Analytics帐户),他们的令牌只会包含"access_token".如果其中一个人撤销了他的令牌,他们就会失去联系.

如何阻止这种情况发生并让每个用户都收到自己的refresh_token?


编辑2:

我在数据存储中存储单独的行,每个用户一个.让我澄清一下 - 如果你看一下这个图,想象一个CMS,其中一个CMS用户需要查看"Liz的个人账户"的统计数据,另一个CMS用户需要查看"Liz的团队账户"的统计数据.

两个CMS用户都来自同一家公司,他们都使用相同的Google帐户 - "liz@gmail.com".CMS用户A使用"liz@gmail.com"连接到Analytics API,收到refresh_token并想查看"Liz网站"的统计信息.然后CMS用户B也使用"liz@gmail.com"连接到Analytics API,但现在他不再收到refresh_token,只有access_token - 这是一个问题,因为在access_token之后将再次要求用户连接到期.

当一个用户断开连接时我通常做的是从数据存储中删除令牌并撤销令牌,但是我可能不应该撤销它,是吗?在任何情况下,如果在我的场景中用户A断开连接,这将删除他的数据存储令牌,这意味着我们将不再存储refresh_token,因为用户B首先没有它.

用户帐户图: 用户帐户图

DaI*_*mTo 5

我想你需要检查databaseDatastore.如果正确完成,您的数据库数据存储区应该为userName代码中标识的每个用户存储refreshTokens .

当新用户进行身份验证时,您应该在数据库中为它们插入新行.

 // New User we insert it into the database
 string insertString = "INSERT INTO [dbo].[GoogleUser]  ([username],[RefreshToken],[Userid]) " +
                                              " VALUES (@key,@value,'1' )";
Run Code Online (Sandbox Code Playgroud)

然后,当您想再次访问它时,您应该再次通过用户名选择它

using (SqlCommand command = new SqlCommand("select RefreshToken from GoogleUser where UserName = @username;", myConnection))
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因它不起作用,那么你应该只删除这一个用户.几乎听起来如果一个身份验证失败,你将全部删除它们.

 // Deletes the users data.                        
 string deleteString = "delete [dbo].[GoogleUser] from " +                                 
                                  " where username = @key";
Run Code Online (Sandbox Code Playgroud)

如果没有看到你如何实现数据库缓存,我无法提供更多帮助,但这是我的databasedatastore.cs版本

更新:

如果您只访问单个Google Analytics帐户,则应使用服务帐户.

更新以响应您的更新

您需要查看我的数据库数据存储区.但严重的是,您不应该有多个用户使用相同的Gmail帐户.

第一步:

用户liz@gmail.com登录到您的应用程序验证应用程序,应使用refreshtoken将一行插入您的数据库用户名liz@gmail.com.您的数据库广告应该处理保存它.

当访问令牌到期时假设您已正确创建数据库缓存,它将使用refreshtoken自动获取用户名liz@gmail.com的新访问令牌.

第2步:

其他人使用liz@gmail.com登录,数据库数据存储检查数据库中的用户名liz@gmail.com并获取与liz@gmail.com关联的刷新令牌并请求新的访问令牌.

您不应该从数据库中删除刷新令牌或用户,除非由于某种原因它不起作用.如果用户访问Google帐户并撤消您的访问权限,则可能无效.应该只有一个用户名liz@gmail.com和与之关联的刷新令牌.

服务帐号:

服务帐户是一种不需要用户对其进行身份验证的身份验证.它的工作原理是在开发者控制台中创建服务帐户身份验证,然后将电子邮件地址添加到Google分析管理员,就像您将其他任何用户一样.现在,服务帐户可以像用户一样直接访问Google Analytics(分析)帐户.

然后,您的应用程序从API请求数据,而不会提示用户进行访问.您可以显示Liz,Jim并起诉所有数据,而不要求他们进行身份验证.

  • 我想知道为什么谷歌不一直发回refresh_token。或者至少他们可以发送一个在同一 Google 帐户的身份验证之间相同的 ID。 (2认同)

mz3*_*mz3 -1

您描述了预期的行为。如果您只是意味着用户断开连接(并不撤销应用程序权限),请尝试将 access_type 设置为“离线”。

\n\n

“Analytics 帐户”和“Google 帐户”之间没有区别。您以 Google 帐户身份向分析 api 进行身份验证。

\n\n

补充笔记:

\n\n
\n

他们使用相同的谷歌帐户,但不同的分析帐户

\n
\n\n

Analytics 使用 Google 帐户登录。也许你的意思是不同的配置文件?

\n\n
\n

如果一个用户断开连接并撤销其令牌,则使用同一 Google 帐户的其他用户也将无法访问 Analytics API,这没有意义\xe2\x80\x99t

\n
\n\n

如果您的应用对 Google 帐户的权限被撤销,您的应用将不再具有访问权限。不存在“Analytics 帐户”这样的东西 - 您需要使用 Google 帐户登录 Google Analytics。经过身份验证后,您的应用程序将有权访问 Google 帐户所拥有的所有 Analytics 配置文件/属性。

\n\n

第一次通过 oauth 身份验证时,您会收到该 Google 帐户的访问令牌和刷新令牌(正如您所注意到的)。除非他们在安全中心的应用权限中删除您的应用,然后稍后再次完成 oauth,否则您不会再收到同一 Google 帐户的其他信息。

\n