我正在使用适用于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。
答案 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);
}