【问题标题】:Obtaining Access token from refresh token using Google API使用 Google API 从刷新令牌中获取访问令牌
【发布时间】:2013-06-14 05:19:30
【问题描述】:

我一直在我的应用程序中使用 .NET 的 google+ api。使用this 中提供的示例 网站我能够获得访问令牌。

我的问题是如何使用 OAuth 2.0 从刷新令牌中获取访问令牌。我还没有找到任何从刷新令牌中获取访问令牌的示例。

我提到了 [google+ API 参考],但他们使用 HTTP 方法提到了它。2请使用 google+ API 提供的方法在 C# 中为我提供一些示例。

【问题讨论】:

  • 感谢@divyanshm,您提供的链接帮助我解决了问题。我有一个疑问。这个刷新令牌是否有过期时间?如果有,那么如何找到它?跨度>
  • 刷新令牌,根据定义,没有到期时间。在用户明确撤销权限之前,它们一直有效。您的应用可以永久保存它们,并在需要时将其交换为访问令牌。
  • 不是真的。刷新令牌确实有到期时间

标签: c#-4.0 oauth-2.0 google-plus access-token


【解决方案1】:

第一次,你需要从浏览器提示中获取访问令牌,然后将其保存在某个商店中。

检查令牌是否过期,然后尝试刷新它。

代码在这里:

private static IAuthorizationState GetAuthentication(NativeApplicationClient arg)
    {
        try
        {

            // Get the auth URL:
            var config = new Configuration();
            var calendarScope = Google.Apis.Util.Utilities.ConvertToString(CalendarService.Scopes.Calendar);
            IAuthorizationState state = new AuthorizationState(new[] { calendarScope });
            state.Callback = new Uri(NativeApplicationClient.OutOfBandCallbackUrl);
            Uri authUri = arg.RequestUserAuthorization(state);
            var authCode = String.Empty;

            if (String.IsNullOrWhiteSpace(config.AccessToken) || config.AccessTokenExpirationTime < DateTime.Now || String.IsNullOrWhiteSpace(config.RefreshToken))
            {

                // Request authorization from the user (by opening a browser window):
                Process.Start(authUri.ToString());
                do
                {
                  authCode = Prompt.ShowDialog("Test", "123");
                } while (String.IsNullOrWhiteSpace(authCode));
                state = arg.ProcessUserAuthorization(authCode, state);
            }
            else
            {
                state.AccessToken = config.AccessToken;
                state.AccessTokenExpirationUtc = config.AccessTokenExpirationTime;
                state.AccessTokenIssueDateUtc = config.AccessTokenIssueTime;
                state.RefreshToken =config.RefreshToken ;
                if (state.AccessTokenExpirationUtc < DateTime.Now)
                {
                    var tokenRefreshed = arg.RefreshToken(state);
                    if (tokenRefreshed)
                    {
                        config.AccessToken = state.AccessToken;
                        config.AccessTokenExpirationTime = state.AccessTokenExpirationUtc;
                        config.AccessTokenIssueTime = state.AccessTokenIssueDateUtc;
                        config.RefreshToken = state.RefreshToken;
                        arg.ProcessUserAuthorization(authCode, state);
                    }
                    else
                    {
                        throw new ApplicationException("Unable to refresh the token.");
                    }
                }
            }
            return state;
        }
        catch (System.Exception exp)
        {
            throw new ApplicationException("Failed to get authorisation from Google Calender.", exp);
        }
    }

【讨论】:

  • NativeApplicationClient arg 参数是什么?就我而言,我使用的是 GMail.Send 范围。我将令牌文件存储在用户应用程序数据文件夹中。这个方法还能用吗?
猜你喜欢
  • 2014-07-15
  • 2015-01-08
  • 2019-06-29
  • 2015-11-26
  • 1970-01-01
  • 2015-07-19
  • 2017-03-22
  • 2020-12-11
  • 1970-01-01
相关资源
最近更新 更多