1

基本的な UbuntuOne API 呼び出しを発行しようとしています。

  1. https://one.ubuntu.com/developer/account_admin/auth/otherplatformsで説明されているように、OAUTH トークンを取得して UbuntuOne サービスに渡しています。
  2. トークンと消費者情報は問題ありません
  3. 次に、/api/file_storage/v1 API 呼び出しを発行しようとしています ( https://one.ubuntu.com/developer/files/store_files/cloudを参照してください)。リクエストは OAUTH トークンを使用して署名されます。

以下のコード スニペットは、私が実行している正確なコードです (email.password/description フィールドを除いたものです)。トークンとコンシューマー データは適切に返されます。/api/file_storage/v1 リクエストを発行すると、サーバーから「401 UNAUTHORIZED」が返されます...理由はわかりますか?

import base64
import json
import urllib
import urllib2
import oauth2

email = 'bla'
password = 'foo'
description = 'bar'

class Unauthorized(Exception):
  """The provided email address and password were incorrect."""

def acquire_token(email_address, password, description):
  """Aquire an OAuth access token for the given user."""
  # Issue a new access token for the user.
  request = urllib2.Request(
    'https://login.ubuntu.com/api/1.0/authentications?' +
    urllib.urlencode({'ws.op': 'authenticate', 'token_name': description}))
  request.add_header('Accept', 'application/json')
  request.add_header('Authorization', 'Basic %s' % base64.b64encode('%s:%s' % (email_address, password)))
  try:
    response = urllib2.urlopen(request)
  except urllib2.HTTPError, exc:
    if exc.code == 401: # Unauthorized
      raise Unauthorized("Bad email address or password")
    else:
      raise
  data = json.load(response)
  consumer = oauth2.Consumer(data['consumer_key'], data['consumer_secret'])
  token = oauth2.Token(data['token'], data['token_secret'])

  # Tell Ubuntu One about the new token.
  get_tokens_url = ('https://one.ubuntu.com/oauth/sso-finished-so-get-tokens/')
  oauth_request = oauth2.Request.from_consumer_and_token(consumer, token, 'GET', get_tokens_url)
  oauth_request.sign_request(oauth2.SignatureMethod_PLAINTEXT(), consumer, token)
  request = urllib2.Request(get_tokens_url)
  for header, value in oauth_request.to_header().items():
    request.add_header(header, value)
  response = urllib2.urlopen(request)

  return consumer, token

if __name__ == '__main__':
  consumer, token = acquire_token(email, password, description)
  print 'Consumer:', consumer
  print 'Token:', token

  url = 'https://one.ubuntu.com/api/file_storage/v1'

  oauth_request = oauth2.Request.from_consumer_and_token(consumer, token, 'GET', url)
  oauth_request.sign_request(oauth2.SignatureMethod_PLAINTEXT(), consumer, token)

  request = urllib2.Request(url)
  request.add_header('Accept', 'application/json')

  for header, value in oauth_request.to_header().items():
    request.add_header(header, value)

  response = urllib2.urlopen(request)
4

1 に答える 1

1

問題は「説明」フィールドにありました。次の形式にする必要があります。

Ubuntu One @ $hostname [$application]

それ以外の場合、UbuntuOne サービスは「ok 0/1」を返し、トークンを登録しません。

于 2013-01-26T21:11:32.800 に答える