Oauth2: удаленный сервер вернул ошибку: (400) неверный запрос

Я хотел бы реализовать Google Oauth2 во внутреннем приложении и играл с демонстрацией, найденной здесь, с помощью консольного приложения C #:

https://code.google.com/p/google-gdata/source/browse/trunk/clients/cs/samples/oauth2_sample/oauth2demo.cs.

Я добавил все необходимые библиотеки API Google в свой проект (основной клиент, YouTube, контакты ……) и зарегистрировал свое приложение…

Когда я запускаю программу, я могу получить обратно код доступа от авторизованного клиента и т. Д.… Я использую правильный clientID, ключ ClientSecret …….

В конце концов я получаю исключение: удаленный сервер возвратил ошибку: (400) Bad Request.

Брошено из этого метода:

    public static void GetAccessToken(OAuth2Parameters parameters) {
      OAuthBase.GetOAuth2AccessToken(parameters, OAuthBase.GetExchangeAccessCodeRequestBody(parameters));
    }

Какие звонки:

общедоступный статический void GetOAuth2AccessToken (параметры OAuth2Parameters, String requestBody) {Uri requestUri = new Uri (parameters.TokenUri); Запрос WebRequest = WebRequest.Create (requestUri); request.Method = "POST";

        request.ContentType = "application/x-www-form-urlencoded";

        Stream outputStream = request.GetRequestStream();
        StreamWriter w = new StreamWriter(outputStream);
        w.Write(requestBody);
        w.Flush();
        w.Close();

        WebResponse response = request.GetResponse();
        string result = "";
        if (response != null) {
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);
            result = reader.ReadToEnd();

            Dictionary<string, string> dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(result);

            if (dict.ContainsKey(OAuth2AccessToken)) {
              parameters.AccessToken = dict[OAuth2AccessToken];
            }
            if (dict.ContainsKey(OAuth2RefreshToken)) {
              parameters.RefreshToken = dict[OAuth2RefreshToken];
            }
            if (dict.ContainsKey(OAuth2TokenType)) {
              parameters.TokenType = dict[OAuth2TokenType];
            }
            if (dict.ContainsKey(OAuth2ExpiresIn)) {
              parameters.TokenExpiry = DateTime.Now.AddSeconds(int.Parse(dict[OAuth2ExpiresIn]));
            }
        }
    }

Может кто-нибудь объяснить, что может вызывать ошибку ниже?

System.Net.WebException was unhandled
  HResult=-2146233079
  Message=The remote server returned an error: (400) Bad Request.
  Source=System
  StackTrace:
       at System.Net.HttpWebRequest.GetResponse()
       at Google.GData.Client.OAuthBase.GetOAuth2AccessToken(OAuth2Parameters parameters, String requestBody) in c \Development\lib\YouTube\libgoogle-data-mono-2.1.0.0\src\core\oauthbase.cs:line 435
       at Google.GData.Client.OAuthUtil.GetAccessToken(OAuth2Parameters parameters) in c:\ \lib\YouTube\libgoogle-data-mono-2.1.0.0\src\core\oauthutil.cs:line 246
       at GoogleAppsConsoleApplication.OAuth2Demo.Main(String[] args) in c:\Users\test\Documents\Visual Studio 2012\Projects\GoogleAppsConsoleApplication\GoogleAppsConsoleApplication\Program.cs:line 60
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:

person user1526912    schedule 26.04.2013    source источник


Ответы (1)


Вы работаете со старым протоколом gdata. Я рекомендую вам работать с клиентской библиотекой API Google. Взгляните на https://code.google.com/p/google-api-dotnet-client/wiki/OAuth2, чтобы узнать, как работать с OAuth2.

person peleyal    schedule 26.04.2013
comment
Спасибо. Я попробую это сделать на выходных. У вас есть пример аутентификации Oauth2 в dotnet? Предпочтительный доступ к библиотекам YOuTube. - person user1526912; 27.04.2013