Я пытаюсь получить обновленный токен доступа, используя Youtube API v2
с C#. Я делаю это так:Youtube API Обновить токен с C# возвращает invalid_grant
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
.
Я читал, что проблема может возникать из разных времен Client-Server, и я пришел к выводу, что на самом деле дата моего Клиента на 3 секунды позже, чем на сервере, например, Клиент 12:10:52 и Сервер 12:10:55.
Я уже пробовал менять дату клиента, но не повезло.
Есть ли у кого-нибудь идеи, как это решить? Используя этот метод или другое, мне просто нужно обновить access token
.
Ознакомьтесь с базовым запросом на отправку почты и сравните его с игровой площадкой oauth. Наиболее вероятная причина в том, что неправильные данные вашего URL-адреса или сообщения не совпадают. – pinoyyid
@pinoyyid Я испортил и получил этот результат: 'POST/o/oauth2/token HTTP/1.1 Host: accounts.google.com Content-length : 211 Content-Type: применение/х-WWW-форм-urlencoded Авторизация: Bearer client_id = XXXXXXXXXXX & client_secret = XXXXXXXXXXX & refresh_token = XXXXXXXXXXX & grant_type = refresh_token' однако он возвращает неверный запрос. Это то же самое: http://goo.gl/FEIwj, но это просто не работает. –
когда вы xxxxxxx вне кодов вы маскируете проблему. Просто измените пару случайных цифр. Я сомневаюсь, что кто-то здесь заинтересован в ваших видео на Youtube. Смотрите мой ответ ниже – pinoyyid