2013-11-20 3 views
0

Я пытаюсь получить обновленный токен доступа, используя 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.

+0

Ознакомьтесь с базовым запросом на отправку почты и сравните его с игровой площадкой oauth. Наиболее вероятная причина в том, что неправильные данные вашего URL-адреса или сообщения не совпадают. – pinoyyid

+0

@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, но это просто не работает. –

+0

когда вы xxxxxxx вне кодов вы маскируете проблему. Просто измените пару случайных цифр. Я сомневаюсь, что кто-то здесь заинтересован в ваших видео на Youtube. Смотрите мой ответ ниже – pinoyyid

ответ

0

Убедитесь, что URL кодирования каждого из параметров формы, а не просто добавляя их к _url - Я думаю, что следующее поможет: http://msdn.microsoft.com/en-us/library/4fkewx0t(v=vs.110).aspx

Кроме того убедитесь, что вы передаете маркер обновления (а не маркеры доступа или Код авторизации). Он не может измениться, но в настоящее время он обычно начинается с «1 /».

+0

Я уже сделал это, и если я сначала закодирую '_url', ошибка возврата изменится с' invalid_grant' на 'invalid_request'. Учитывая, что я могу установить первое соединение без ссылки на URL-адрес, я полагаю, мне не нужно делать это здесь, в любом случае, и не работает. Что касается 'refresh_token', я использую правильный, и он начинается с« 1/». –

+0

Я не хотел кодировать весь _url, а URL-адрес кодирует каждый из параметров, которые его составляют. То есть: _url = "client_id =" + urlencode (client_id) + "& ...". Можете ли вы подтвердить, что это то, что вы уже делаете? (в вашем комментарии это было неясно) – aeijdenberg

+0

Я фактически кодировал весь '_url', следовательно, возвращал' invalid_request'. Однако, даже если я кодирую каждый параметр, возвращаемая ошибка по-прежнему 'invalid_grant'. –

0

Как @aeijdenberg, я подозреваю, что вы не правильно urlencoding каждого параметра. Помните, что мой совет - пойти на Oauth Playground и посмотреть, что он отправляет. (Документы НЕ URI кодирования Params, который вводит в заблуждении)

Так вот то, что ваш запрос должен выглядеть

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 

Если и только в том случае, Ваш запрос будет точно так же, как это и вас по-прежнему получают недействительный грант, тогда есть проблема с токеном обновления, поэтому получите новый.

+0

Мой запрос точно такой же, как ваш, и он возвращает 'invalid_grant' на игровой площадке OAuth. Я уже пробовал с новым 'refresh_token', и то же самое происходит. Это факт, что мой 'access_token' по-прежнему действителен, но я уже пробовал это до и после того, как токен истек, и он всегда возвращает' invalid_grant'. В службах API у меня есть API запросов BigQuery, Freebase, YouTube Analytics и Youtube Data API, я пропустил какие-либо службы? –

+0

Я сделал снимок экрана OAuthPlayground с моей проблемой, можете ли вы сказать мне, что здесь что-то не так [screenshot] (http://oi40.tinypic.com/ab4ebd.jpg). Еще одна вещь, которую я сделал, я удалил разрешения приложений в учетной записи пользователя Google и снова дал им другую проверку подлинности, но это не решило проблему. –

Смежные вопросы