如何在C#中的Google.Apis.Core 1.9中将​​AccessType设置为离线

时间:2014-11-07 00:56:10

标签: c# oauth-2.0 google-api google-api-dotnet-client

我正在使用适用于OAuth2版本1.9的Google API并尝试将AccessType作为离线发送,并且每次都强制将ApprovalPrompt作为强制发送,以便获得刷新令牌。我知道这里有很多关于这个主题的问题,包括各种api版本和语言。但是,没有一个解决方案适用于新的谷歌库。

我正在使用以下内容来获取流程:

private IAuthorizationCodeFlow GetAuthorizationCodeFlow()
        {
            var flow = new GoogleAuthorizationCodeFlow(
                new GoogleAuthorizationCodeFlow.Initializer
                {
                    ClientSecrets = new ClientSecrets
                    {
                        ClientId =
                            "***",
                        ClientSecret = "***"
                    },

                    Scopes = new string[]
                                 {
                                     CalendarService.Scope.Calendar,
                                     PlusService.Scope.UserinfoProfile,
                                     PlusService.Scope.UserinfoEmail,
                                     PlusService.Scope.PlusLogin,
                                     "https://www.googleapis.com/auth/contacts.readonly"
                                 }
                });

            return flow;            
        }

然后使用以下代码获取令牌:

var token = flow.ExchangeCodeForTokenAsync("me", code,
                    uri.Substring(0, uri.IndexOf("?")), CancellationToken.None).Result;

这是我每次都需要刷新令牌的地方(不仅仅是第一次),所以我想设置AccessType和ApprovalPrompt。

1 个答案:

答案 0 :(得分:3)

我也有同样的问题。积分转到this post。 我将粘贴我的代码,因为我必须进行一些小改动才能使其正常工作。 (在构造函数中使用GoogleAuthorizationCodeFlow.Initializer而不是AuthorizationCodeFlow.Initializer)

实施您自己的GoogleAuthorizationCodeFlow类,并在AccessType属性中设置“离线”访问权限。这将为您提供refreshtoken。

 public class OfflineAccessGoogleAuthorizationCodeFlow : GoogleAuthorizationCodeFlow
    {
        public OfflineAccessGoogleAuthorizationCodeFlow(GoogleAuthorizationCodeFlow.Initializer initializer) : base(initializer) { }

        public override AuthorizationCodeRequestUrl CreateAuthorizationCodeRequest(string redirectUri)
        {
            return new GoogleAuthorizationCodeRequestUrl(new Uri(AuthorizationServerUrl))
            {
                ClientId = ClientSecrets.ClientId,
                Scope = string.Join(" ", Scopes),
                RedirectUri = redirectUri,
                AccessType = "offline",
                ApprovalPrompt = "force"
            };
        }
    };

很遗憾,我们无法从GoogleAuthorizationCodeFlow初始化程序中设置“access_type”。

另外,我使用以下代码来检索刷新令牌,

Google.Apis.Auth.OAuth2.Responses.TokenResponse token = new Google.Apis.Auth.OAuth2.Responses.TokenResponse();
            //// Checks if the token is out of date and refresh the access token using the refresh token.
            if (result.Credential.Token.IsExpired(SystemClock.Default))
            {
                //If the token is expired recreate the token
                token = await result.Credential.Flow.RefreshTokenAsync(userid.ToString(), result.Credential.Token.RefreshToken, CancellationToken.None);

                //Get the authorization details Results 
                result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).AuthorizeAsync(cancellationToken);
            }