C# 使用.NET的YouTube v3数据API,如何获取刷新令牌?
我需要能够使用刷新令牌,以便能够在访问令牌过期后重新验证令牌。如何使用C#v3 API实现这一点?我已经看过UserCredential类和AuthorizationCodeFlow类,没有任何东西向我跳出来 我最初使用以下代码对其进行身份验证C# 使用.NET的YouTube v3数据API,如何获取刷新令牌?,c#,oauth-2.0,access-token,youtube-data-api,C#,Oauth 2.0,Access Token,Youtube Data Api,我需要能够使用刷新令牌,以便能够在访问令牌过期后重新验证令牌。如何使用C#v3 API实现这一点?我已经看过UserCredential类和AuthorizationCodeFlow类,没有任何东西向我跳出来 我最初使用以下代码对其进行身份验证 var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()). AuthorizeAsync(CancellationToken.None)
var result = await new AuthorizationCodeMvcApp(this, new AppFlowMetadata()).
AuthorizeAsync(CancellationToken.None);
if (result.Credential != null)
{
var service = new YouTubeService(new BaseClientService.Initializer
{
HttpClientInitializer = result.Credential,
ApplicationName = "YouTube Upload Tool"
});
}
这是我的AppFlowMetadata类
public class AppFlowMetadata : FlowMetadata
{
private static readonly IAuthorizationCodeFlow flow =
new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = "ID",
ClientSecret = "SECRET",
},
Scopes = new[] { YouTubeService.Scope.YoutubeUpload },
DataStore = new EFDataStore(-1) // A data store I implemented using Entity Framework 6.
});
public override string GetUserId(Controller controller)
{
return "test";
}
public override IAuthorizationCodeFlow Flow
{
get { return flow; }
}
}
如果有人能提出任何建议,我将不胜感激。谢谢。虽然这不是一个答案,但我就是这样解决的。我必须手动创建GET授权请求(将您的用户重定向到您返回的url,并设置控制器操作以接收在Google开发者控制台中指定的回调)和令牌的PUT请求(然后使用EF6存储)。我使用
System.Net.Http.HttpClient
发出这些请求,这非常简单。请参阅,了解我需要的所有详细信息,以使其正常工作
这是我将访问类型设置为“脱机”的唯一方法。如果.NETAPI能做到这一点,我仍然很想知道它是如何做到的
存储了令牌数据后,我现在使用API在需要时验证和刷新令牌。实际上,我是在服务器端控制台应用程序中而不是在MVC应用程序中实现的(因此使用EF令牌持久性)
我希望这能帮助其他人。我也遇到了同样的问题,并解决了它。[检查我的解决方案][1][1]:谢谢你提出这个问题,尽管它不能解决我的问题。我很高兴有人认为谷歌的OAuth2.0API文档真的很肤浅。他们描绘了一个“一切正常”的想法,但作为程序员,我们知道这从来都不是事实!我需要一个ASP.Net的解决方案,在他们的MVC示例中,他们没有重定向用户…是的。发现API非常令人沮丧。他们实现的流编程模型似乎只适合特定的用例,这很好,但在文档中不够清楚。我认为离线访问应该是API中常见的事情,所以记录如何正确地进行这项工作肯定会在那里(免责声明:我已经有一段时间没有看过了,所以现在很可能就在那里)。
UserCredential credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = "ID",
ClientSecret = "Secret"
},
new[] { YouTubeService.Scope.YoutubeUpload },
"12345",
CancellationToken.None,
new EFDataStore(-1) // My own implementation of IDataStore
);
// This bit checks if the token is out of date,
// and refreshes the access token using the refresh token.
if(credential.Token.IsExpired(SystemClock.Default))
{
if (!await credential.RefreshTokenAsync(CancellationToken.None))
{
Console.WriteLine("No valid refresh token.");
}
}
var service = new YouTubeService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "MY App"
});