Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用.NET的YouTube v3数据API,如何获取刷新令牌?_C#_Oauth 2.0_Access Token_Youtube Data Api - Fatal编程技术网

C# 使用.NET的YouTube v3数据API,如何获取刷新令牌?

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)

我需要能够使用刷新令牌,以便能够在访问令牌过期后重新验证令牌。如何使用C#v3 API实现这一点?我已经看过UserCredential类和AuthorizationCodeFlow类,没有任何东西向我跳出来

我最初使用以下代码对其进行身份验证

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"
    });