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

@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 に答える
0

フォーム パラメータを単に追加するのではなく、各フォーム パラメータを URL エンコードするようにして_urlください

さらに、(アクセス トークンや認証コードではなく) 更新トークンを渡していることを確認してください。変更される保証はありませんが、現在は通常 "1/" で始まります。

于 2013-11-20T16:58:15.623 に答える