API контактов Google: неавторизованный 401 неизвестный заголовок авторизации - PullRequest
5 голосов
/ 20 марта 2012

Я внимательно прочитал документацию по API Контактов Google, но не могу правильно получить запросы PUT (т.е. обновления). Я использую Ruby on Rails 3.2 с гемом OAuth (v0.4.5). Я получаю токены с помощью Omniauth, а область действия определяется как "https://www.google.com/m8/feeds"

Позвольте мне продемонстрировать:

ruby-1.9.2-p290 :001 > @access_token.get("https://www.google.com/m8/feeds/contacts/default/full/c1f86b48b52548c", {"GData-Version" => "3.0"})
=> #<Net::HTTPOK 200 OK readbody=true>

Как видите, запросы GET работают хорошо, поэтому мой токен доступа OAuth должен быть в порядке. DELETE-запросы тоже работают:

ruby-1.9.2-p290 :002 > @access_token.delete('https://www.google.com/m8/feeds/contacts/default/full/c1f86b48b52548c', { 'GData-Version' => '3.0', 'If-Match' => '"RH46fTVSLyt7I2A9Wx9VFkgMQAU."' })
 => #<Net::HTTPOK 200 OK readbody=true>

Пока все хорошо. Здесь я указал Etag контактной записи в заголовке запроса, как указано в документации Google [1]. Так что это не должно вызывать никаких проблем.

В соответствии с документацией к гему OAuth [2] синтаксис запроса PUT должен быть следующим:

- (Object) put(path, body = '', headers = {})

И пример из документации:

@token.put('/people/123', @person.to_xml, { 'Accept' => 'application/xml', 'Content-Type' => 'application/xml' })

Насколько я понимаю, я должен отправлять простую строку XML в качестве тела запроса PUT. Итак, давайте сначала соберем пример данных:

ruby-1.9.2-p290 :003 > xmldata = @access_token.get("https://www.google.com/m8/feeds/contacts/default/full/5f74bf0d5c621a", {"GData-Version" => "3.0"}).body

=> "<?xml version='1.0' encoding='UTF-8'?>
      <entry xmlns='http://www.w3.org/2005/Atom' xmlns:gContact='http://schemas.google.com/contact/2008' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gd='http://schemas.google.com/g/2005' gd:etag='&quot;R3w4fzVSLit7I2A9WhRaGEQCQgc.&quot;'>
        <id>http://www.google.com/m8/feeds/contacts/my.email%40address.com/base/5f74bf0d5c621a</id>
        <updated>2012-02-22T08:15:36.237Z</updated>
        <app:edited xmlns:app='http://www.w3.org/2007/app'>2012-02-22T08:15:36.237Z</app:edited>
        <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>
        <title>Joe Average</title>
        <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/my.email%40address.com/5f74bf0d5c621a?v=3.0'/>
        <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/my.email%40address.com/full/5f74bf0d5c621a?v=3.0'/>
        <link rel='edit' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/my.email%40address.com/full/5f74bf0d5c621a?v=3.0'/>
        <gd:name>
          <gd:fullName>Joe Average</gd:fullName>
          <gd:givenName>Joe</gd:givenName>
          <gd:familyName>Average</gd:familyName>
        </gd:name>
        <gd:email rel='http://schemas.google.com/g/2005#other' address='joe.average@isp.net' primary='true'/>
      </entry>"

... и попробуйте обновить его обратно в Google:

ruby-1.9.2-p290 :004 > @access_token.put("https://www.google.com/m8/feeds/contacts/default/full/5f74bf0d5c621a", xmldata, {"GData-Version" => "3.0", 'If-Match' => '"R3w4fzVSLit7I2A9WhRaGEQCQgc."'})

=> #<Net::HTTPUnauthorized 401 Unknown authorization header readbody=true>

Так что это не работает. Давайте попробуем немного урезать XML, чтобы он выглядел так же, как в документации [1]:

xmldata = "<entry gd:etag='&quot;R3w4fzVSLit7I2A9WhRaGEQCQgc.&quot;'>
             <id>http://www.google.com/m8/feeds/contacts/my.email%40address.com/base/5f74bf0d5c621a</id>
             <updated>2012-02-22T08:15:36.237Z</updated>
             <category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/contact/2008#contact'/>
             <link rel='http://schemas.google.com/contacts/2008/rel#photo' type='image/*' href='https://www.google.com/m8/feeds/photos/media/my.email%40address.com/5f74bf0d5c621a?v=3.0'/>
             <link rel='self' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/my.email%40address.com/full/5f74bf0d5c621a?v=3.0'/>
             <link rel='edit' type='application/atom+xml' href='https://www.google.com/m8/feeds/contacts/my.email%40address.com/full/5f74bf0d5c621a?v=3.0'/>
             <gd:name>
               <gd:fullName>Joe Average</gd:fullName>
               <gd:givenName>Joe</gd:givenName>
               <gd:familyName>Average</gd:familyName>
             </gd:name>
             <gd:email rel='http://schemas.google.com/g/2005#other' address='joe.average@isp.net' primary='true'/>
           </entry>"

Но не повезло, точно такая же ошибка, как и раньше.

Это то место, где я сейчас застрял. Буду очень признателен за любые подсказки в правильном направлении.

[1] https://developers.google.com/google-apps/contacts/v3/#updating_contacts

[2] http://rubydoc.info/gems/oauth/0.4.5/OAuth/AccessToken

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Вместо добавления в URL:

& oauth_token = TOKEN

используйте заголовок:

Авторизация: Bearer TOKEN

0 голосов
/ 12 мая 2013

Попробуйте установить для заголовка Content-Type значение 'application / atom + xml' в вашем запросе PUT. У меня была похожая проблема, и это помогло.

...