MVC应用中的Google OAuth访问令牌到期?

mon*_*tro 7 asp.net-mvc google-oauth google-api-dotnet-client

我按照此处的说明使用Google Oauth2编写了一个MVC应用程序:https: //developers.google.com/api-client-library/dotnet/guide/aaa_oauth#web_applications

我有访问令牌到期的问题.当访问令牌过期时,我在调用Google API时遇到异常:"访问令牌已过期,但我们无法刷新它"

初始身份验证是两种迭代机制:

第一次迭代AuthorizeAsync返回结果为空Credential,并填充RedirectUri:

因此,创建的授权URL是:

https://accounts.google.com/o/oauth2/auth?access_type=offline&response_type=code&client_id=MYCLIENTID&redirect_uri=http:%2F%2Flocalhost%2FHomepage%2FAuthCallback%2FIndexAsync&scope=https:%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar https:%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.readonly&state=http:%2F%2Flocalhost%2FHomepage%2F95419199
Run Code Online (Sandbox Code Playgroud)

请注意,access_type = offline存在.所以我也应该恢复刷新令牌(不会发生).

在此输入图像描述

第二次迭代 - AuthorizeAsync返回带有填充的凭据且空RedirectUri的结果:

问题1 - 此时RefreshToken是否应该为空?

在此输入图像描述

记住结果,因为它被定义为静态的.

下一个请求 - 需要result.Credential调用Google Calendar API的日历操作:

问题2 - 如果访问令牌在那一刻到期(为了测试我只设置ExpiresInSeconds = 0),我调用RefreshTokenAsync方法,但它总是返回false!为什么?我在这里错过了什么?

当RefreshTokenAsync返回false时,处理什么是正确的方法?当前RedirectResult(result.RedirectUri)命令将失败,因为result.RedirectUri为null.

在此输入图像描述

mon*_*tro 10

哦,我终于明白了:)对于那些感兴趣的人 - 刷新令牌只发出一次,当你得到Consent屏幕时,你必须点击是.

因此,要获取刷新令牌,请转到您的帐户设置,帐户权限:https://security.google.com/settings/security/permissions

并取消对您在Google Developers Console中配置的项目的访问权限:https://console.developers.google.com/project

现在,在调用AuthorizeAsync后,在下一行放置断点,在调试模式下重新启动应用程序,获取同意屏幕询问权限,单击"接受".

该应用程序将返回VS并将在您的断点处停止.

现在,在某处记录结果.Credential.Token.RefreshToken值,它是一个加密的字符串.

为了简单起见,我将我放在web.config appsetting中.

现在,我只是将该值赋给result.Credential.Token.RefreshToken = refreshToken;

每次访问令牌到期时,它都会自动刷新它.

在此输入图像描述

就像这里当我调用GmailService request.Execute(...)传递包含令牌的凭证对象时,令牌将被刷新.

在此输入图像描述