c# – Google API Oauth2:所有用户只有一个刷新令牌?

我使用OAuth2身份验证,我有一个拥有多个用户的CMS,每个用户都有自己的配置文件.事实上,我们公司拥有可以访问多个Google Analytics(分析)帐户的Google帐户.对于使用CMS的每个用户,我使用其他用户名连接到Google Analytics(分析)API,并将每个用户的令牌保存在数据库数据存储中.问题是,如果一个用户断开并撤消他的令牌,那么使用相同Google帐户的其他用户都不能访问Google Analytics(分析)API,这是没有意义的.

编辑:经过进一步调查,我发现当第一个用户认证时,保存在数据存储中的令牌包含一个’refresh_roken’以及一个’access_token’.但是,当其他用户进行身份验证(他们使用相同的Google帐户但不同的Google Analytics(分析)帐户)时,他们的令牌只会包含“access_token”.如果其中一个人撤销他的令牌,所有人都将失去联系.

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

编辑2:

我在数据存储中存储单独的行,每个用户有一行.让我澄清一下 – 如果你看看this diagram,想像一个CMS,一个CMS用户需要查看“Liz的个人帐户”的统计信息,另一个CMS用户需要查看“Liz的团队帐户”的统计信息.

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

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

用户帐户图:

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

当新用户认证时,您应该为数据库插入新行.

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

那么当你想再次访问它,你应该再次用用户名选择它

using (SqlCommand command = new SqlCommand("select RefreshToken from GoogleUser where UserName = @username;", myConnection))

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

 // Deletes the users data.                        
 string deleteString = "delete [dbo].[GoogleUser] from " +                                 
                                  " where username = @key";

没有看到你如何实现databasedatastore我不能帮助更多,但这是我的版本databasedatastore.cs

更新:

如果您只访问一个Google Analytics(分析)帐户,那么您应该使用服务帐户.

更新以响应您的更新

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

步骤1:

用户liz@gmail.com登录到您的应用程序认证应用程序,一行应该插入到您的数据库用户名liz@gmail.com与refreshtoken.你的databasedatastore应该处理保存.

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

第2步:

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

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

Service account:

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

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

转载注明原文:c# – Google API Oauth2:所有用户只有一个刷新令牌? - 代码日志