0

我正在尝试使用Youtube API v2with C# 获取刷新的访问令牌。我这样做是这样的:

string _url = "client_id=" + HttpUtility.UrlEncode(_clientID) + "&client_secret=" + HttpUtility.UrlEncode(_clientSecret) + "&refresh_token=" + HttpUtility.UrlEncode(_refreshToken) + "&grant_type=refresh_token";

public string RefreshYoutubeToken(string _url) {
    string _response = "";
    TcpClient _tcpClient = new TcpClient("accounts.google.com", 443);
    Stream _netStream = _tcpClient.GetStream();
    SslStream _sslStream = new SslStream(_netStream);
    _sslStream.AuthenticateAsClient("accounts.google.com");
    {
        byte[] _contentAsBytes = Encoding.ASCII.GetBytes(_url.ToString());

        StringBuilder _message = new StringBuilder();
        _message.AppendLine("POST /o/oauth2/token HTTP/1.1");
        _message.AppendLine("Host: accounts.google.com");
        _message.AppendLine("Content-Type: application/x-www-form-urlencoded");
        _message.AppendLine("Content-Length: " + _contentAsBytes.Length.ToString());
        _message.AppendLine("");

        byte[] _headerAsBytes = Encoding.ASCII.GetBytes(_message.ToString());
        _sslStream.Write(_headerAsBytes);
        _sslStream.Write(_contentAsBytes);
    }

    StreamReader _reader = new StreamReader(_sslStream);
    while(true) {  // Print the response line by line to the debug stream for inspection.
        string _line = _reader.ReadLine();
        if(_line == null) { break; }
        _response += _line;
        if(_line == "0") { break; }
    }
    return _response;
}

当我第一次登录并检索时,这很好用access token,但是,当我想使用refresh token检索新的access token时,就像他们在 Google Developers 中描述的那样 - https://developers.google.com/youtube/ 2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token - 我收到返回错误invalid_grant

我在某处读到问题可能来自不同的客户端-服务器日期时间,我得出的结论是,实际上我的客户端日期比服务器晚了大约 3 秒,例如,客户端 12:10:52 和服务器 12:10:55 .
我已经尝试更改客户端日期时间,但没有运气。

有谁知道如何解决这个问题?使用这种方法或其他方法,我只需要刷新access token.

4

2 回答 2

0

确保对每个表单参数进行 URL 编码,而不仅仅是将它们附加到_url- 我认为以下内容会有所帮助: http: //msdn.microsoft.com/en-us/library/4fkewx0t (v=vs.110).aspx

此外,请确保您传递的是刷新令牌(而不是访问令牌或授权代码)。它不保证会改变,但目前它通常以“1/”开头。

于 2013-11-20T16:58:15.623 回答
0

作为@aeijdenberg,我怀疑您没有正确对每个参数进行urlencoding。请记住,我的建议是去 Oauth Playground 看看它发送了什么。(文档不会对具有误导性的参数进行 uri 编码)

所以这就是你的请求应该是什么样子

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Content-length: 163
content-type: application/x-www-form-urlencoded
user-agent: google-oauth-playground

client_secret=************&grant_type=refresh_token&refresh_token=1%2Fz5Ogwmp8TqDL31eU1L_Nhddiva_L_8tR7V9k&client_id=407408718192.apps.googleusercontent.com

且仅当您的请求与此完全相同并且您仍然获得无效授权时,您的刷新令牌存在问题,因此请获取一个新令牌。

于 2013-11-20T18:11:05.593 回答