我正在尝试使用带有C#的Youtube API v2
获取刷新的访问令牌。我是这样做的:
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
。
答案 0 :(得分:0)
确保您对每个表单参数进行网址编码,而不是仅将其附加到_url
- 我认为以下内容会有所帮助:http://msdn.microsoft.com/en-us/library/4fkewx0t(v=vs.110).aspx
此外,请确保传递刷新令牌(而不是访问令牌或授权码)。它无法保证更改,但目前它通常以" 1 /"开头。
答案 1 :(得分:0)
作为@aeijdenberg,我怀疑你没有正确地对每个参数进行urlencoding。记住我的建议是去Oauth Playground看看它发送的是什么。 (文档不会对误导性的参数进行编码)
所以这是您的请求应该是什么样的
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
如果,并且只有当您的请求与此完全相同且仍然获得无效授权时,您的刷新令牌就会出现问题,因此请换一个新的。