Asp.net mvc MVC应用中的Google OAuth访问令牌过期?

Asp.net mvc MVC应用中的Google OAuth访问令牌过期?,asp.net-mvc,google-oauth,google-api-dotnet-client,Asp.net Mvc,Google Oauth,Google Api Dotnet Client,我使用Google Oauth2编写了一个MVC应用程序,如下所示: 我遇到访问令牌过期问题。当访问令牌过期时,我在调用Google API时遇到异常:“访问令牌已过期,但我们无法刷新它” 初始身份验证是两次迭代机制: 第一次迭代AuthorizeAsync返回凭证为空的结果,并填充重定向URI: 因此,创建的授权url如下所示: https://accounts.google.com/o/oauth2/auth?access_type=offline&response_type=co

我使用Google Oauth2编写了一个MVC应用程序,如下所示:

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

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

第一次迭代AuthorizeAsync返回凭证为空的结果,并填充重定向URI:

因此,创建的授权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
请注意,存在access_type=offline。所以我也应该拿回刷新令牌(不会发生)

第二次迭代-AuthorizeAsync返回结果,其中包含填充的凭据和空的重定向URI:

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

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

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

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

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

哦,我终于明白了:) 对于那些感兴趣的人-刷新令牌只发布一次,当您获得同意屏幕时,您必须单击“是”

因此,要获取刷新令牌,请转到您的帐户设置,帐户权限:

并撤销您在Google Developers Console中配置的项目的访问权限:

现在,在调用AuthorizeAsync后,在下一行放置一个断点,在调试模式下重新启动应用程序,获得请求权限的同意屏幕,单击接受

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

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

为了简单起见,我将我的应用程序设置放在web.config appsetting中

现在,我只需将该值赋回到result.Credential.Token.RefreshToken=RefreshToken

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

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