2011-12-21 3 views
0

ПОМОЩЬ!
Я пытаюсь обновить программу, чтобы поддерживать новую версию, которую Google использует в AdWords.
Используя мой сайт, я могу создать accessToken и accessTokenSecret для своих пользователей и сохранить его в своей базе данных.КАК ОАЙТ И МЫЛО?

Моя проблема в том, что я пытаюсь сделать запрос на мыло позже с этими учетными данными.

  • Какую информацию мне нужно сэкономить на сайте? пока я сохраняю только accessToken и accessTokenSecret. есть ли еще что-нибудь?
  • Как использовать accessToken, accessTokenSecret и что еще я сохранил, чтобы сделать SOAP-запросы? (пожалуйста, будьте как «низкий уровень», как можете, «просто используйте их в заголовке запроса» мне не поможет).

Некоторая информация о моем процессе:

  • Не с помощью клиентской библиотеки из Google (слишком много над головой, и до сих пор я не нуждался в них).
  • Использование автогенерированного SOAP-кода с использованием VS2005 WSDL для служб, которые я использую.
  • C# код.

Любая помощь будет высоко оценена.
Спасибо!

==================================================================================================================== ======================================= 0 0 следующим образом:

protected override WebRequest GetWebRequest(Uri uri) 
     { 
      WebRequest request = base.GetWebRequest(uri); 

      String token = "XXXXXXXXXXX";//a valid token - changed for here. 
      String secret = "XXXXXXXXXXXX";//a valid secret - changed for here. 
      String consumerKey = "anonymous"; 
      String consumerSecret = "anonymous"; 
      String sigMet = "HMAC-SHA1"; 
      String oauth_timestamp = ((DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks)/(1000 * 10000)).ToString(); 
      String oauth_nonce = Guid.NewGuid().ToString(); 

      Parameter[] paramArray = new Parameter[]{ 
             new Parameter("oauth_consumer_key", consumerKey), 
             new Parameter("oauth_token", token), 
             new Parameter ("oauth_signature_method", sigMet), 
             new Parameter ("oauth_timestamp", oauth_timestamp), 
             new Parameter ("oauth_nonce", oauth_nonce) 
             }; 

      String oauth_signature = CreateHMACSHA1Signature(
             request.Method, 
             uri, 
             paramArray, 
             consumerSecret, 
             secret 
             ); 

      request.Headers.Add(
          "Authorization: OAuth " + 
          "realm=\"" + "https://www.google.com/" + "\"," + 
          "oauth_consumer_key=\"" + Parameter.EncodeParameterString(consumerKey) + "\"," + 
          "oauth_token=\"" + Parameter.EncodeParameterString(token) + "\"," + 
          "oauth_signature_method=\"" + Parameter.EncodeParameterString(sigMet) + "\"," + 
          "oauth_signature=\"" + Parameter.EncodeParameterString(oauth_signature) + "\"," + 
          "oauth_timestamp=\"" + Parameter.EncodeParameterString(oauth_timestamp) + "\"," + 
          "oauth_nonce=\"" + Parameter.EncodeParameterString(oauth_nonce) + "\"" 
         ); 

      return request; 
     } 

функция CreateHMACSHA1Signature такая же, один используется для с OAuthGetRequestToken и OAuthAuthorizeToken просто отлично. но при использовании с SOAP я получаю следующее сообщение об ошибке:
System.Web.Services.Protocols.SoapException: AuthenticationError.OAUTH_TOKEN_HEADER_INVALID @ Service [ServicedAccountService.get]

Любая идея, почему это?

ответ

0

УСПЕХА !!!

Я точно нашел, что не так, и это было только случайно. При создании подписи я использовал параметр request.method для параметра метода.
Проблема в том, что в данный момент метод «GET», но механизм SOAP изменит его на «POST» (чтобы он мог передавать параметры SOAP), поэтому моя подпись не работает.

единственное исправление мне нужно сделать, это изменить:

String oauth_signature = CreateHMACSHA1Signature(
    request.Method, 
    ... 
    ) 

к:

String oauth_signature = CreateHMACSHA1Signature(
    "POST", 
    ... 
    ) 
3

Я ответил на этот вопрос здесь, в контексте клиентской библиотеки .NET, по адресу Google Ads API, C#, SOAP request with new oAuth 1.0?. Но чтобы ответить на ваш вопрос в контексте NoClientLibrary,

  1. Вам просто нужен ключ потребителя в дополнение к ключу доступа и секретности OAuth.
  2. Вам необходимо подписать запрос, как если бы вы запрашивали обычный ресурс, защищенный OAuth. Затем поместите подпись в HTTP-заголовок авторизации (а не в заголовок SOAP) вашего веб-запроса SOAP. Однако получение базового HttpWebRequest для объекта SOAPHttpClientProtocol не так просто. Вы должны расширить объект SOAPHttpClientProtocol, переопределить защищенный метод GetWebRequest и установить заголовки OAuth на данном этапе: Что-то вроде:

    protected override WebRequest GetWebRequest(Uri uri) { 
        WebRequest request = base.GetWebRequest(uri); 
        string oAuthHeader = SignTheRequestAndGetTheOAuthHeader(request); 
        if (!string.IsNullOrEmpty(oAuthHeader)) { 
        request.Headers["Authorization"] = oAuthHeader; 
        } 
        return request; 
    } 
    

Это также означает, что вы должны вручную изменить сгенерированный код, чтобы изменить базу класс ваших классов обслуживания заглушек, то, что вам не понравится в долгосрочной перспективе.Кроме того, если вы не знаете, как обычно запрашивать ресурс, защищенный OAuth, соответствующая документация находится на http://oauth.net/core/1.0/#anchor13.

Теперь это то, что позаботились о вас в клиентской библиотеке .NET. Библиотека не так уж сложна в использовании, достаточно статей wiki на http://code.google.com/p/google-api-adwords-dotnet/wiki, чтобы вести вас. Я рекомендую вам использовать клиентскую библиотеку .NET, но если вы этого не сделаете, вот список ошибок, которые вы должны знать при выборе маршрута NoClientLibrary: http://code.google.com/p/google-api-adwords-dotnet/wiki/NoClientLibrary.

Я также хотел упомянуть, что официальный форум для обсуждения AdWords API находится в http://groups.google.com/group/adwords-api?pli=1, и я часто отвечаю на вопросы разработчиков там. Если у вас есть какие-либо последующие вопросы, не стесняйтесь спрашивать об этом, и я буду рад ответить на ваши вопросы.

Приветствия, Анаш

+0

собирается над «http://code.google.com/p/google-api-adwords- dotnet/wiki/NoClientLibrary «Я вижу, что там так много объяснений. если бы только могло быть объяснение того, как создать «oAuth», как они объясняют, как создать «AuthToken», каждая вещь была потрясающей. –

+0

Эй, беря ваш совет, я, кажется, могу добавить свою просьбу к просьбе. но я получаю ошибку OAUTH_TOKEN_HEADER_INVALID, и я не могу понять, почему. есть идея? Благодаря ! –

+0

Я сейчас в отпуске, но я добавлю версию NoClientLibrary OAuth, когда вернусь из отпуска. –

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