0

アプリケーションからユーザーの Gmail メッセージにアクセスする必要があるため、Google のxoauth.pyスクリプトを django アプリケーションに統合しています。私の意図は、ユーザーがこの機能にアクセスし、後で使用するために認証トークンを保存することを意図したら、キー/シークレット ペアを作成することです。これは 2 段階の操作です。検証 URL (ユーザーが検証コードを取得する場所) を取得し、認証トークンを取得します。2 番目のステップは、次のメッセージで失敗します。

Request Method: GET
Request URL: http://localhost:8000/authorization_token?user=iferca@ecoresol.com&code=ycH19iaufCHoJ7APVkBGe_Hu&key=4/nj5s6sLBx-DKWUYJlUzERnngOO_6&token=wwvSU3ws448HR1gqiN7NxTh7

Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/iferca/devel/gmail/workspace/imapsrv/imapsrv/../imapsrv/gdg/views.py" in request_authoization_token
  27.     response = xoauth.generateAuthorizationTokenFromVerificationCode(user, code,         request_key, request_secret)
File "/Users/iferca/devel/gmail/workspace/imapsrv/imapsrv/../imapsrv/gdg/xoauth.py" in generateAuthorizationTokenFromVerificationCode
  512.         google_accounts_url_generator)
File "/Users/iferca/devel/gmail/workspace/imapsrv/imapsrv/../imapsrv/gdg/xoauth.py" in    GetAccessToken
  316.                                      request_token.secret)
File "/Users/iferca/devel/gmail/workspace/imapsrv/imapsrv/../imapsrv/gdg/xoauth.py" in GenerateOauthSignature
  200.   return GenerateHmacSha1Signature(base_string, key)
File "/Users/iferca/devel/gmail/workspace/imapsrv/imapsrv/../imapsrv/gdg/xoauth.py" in GenerateHmacSha1Signature
  194.   digest = hmac.new(key, text, hashlib.sha1)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hmac.py" in new
  133.     return HMAC(key, msg, digestmod)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/hmac.py" in __init__
  72.         self.outer.update(key.translate(trans_5C))

Exception Type: TypeError at /authorization_token
Exception Value: character mapping must return integer, None or unicode

同じスクリプトがコマンド ラインで適切に実行されます。次のように、Pythonコンソールを使用して手動でエラーをスローする行をテストしましたが、エラーを再現できません。

>>> key = "anonymous&wwvSU3ws448HR1gqiN7NxTh7"
>>> trans_5C = "".join ([chr (x ^ 0x5C) for x in xrange(256)])
>>> trans_5C
'\\]^_XYZ[TUVWPQRSLMNOHIJKDEFG@ABC|}~\x7fxyz{tuvwpqrslmnohijkdefg`abc\x1c\x1d\x1e\x1f\x18\x19\x1a\x1b\x14\x15\x16\x17\x10\x11\x12\x13\x0c\r\x0e\x0f\x08\t\n\x0b\x04\x05\x06\x07\x00\x01\x02\x03<=>?89:;45670123,-./()*+$%&\' !"#\xdc\xdd\xde\xdf\xd8\xd9\xda\xdb\xd4\xd5\xd6\xd7\xd0\xd1\xd2\xd3\xcc\xcd\xce\xcf\xc8\xc9\xca\xcb\xc4\xc5\xc6\xc7\xc0\xc1\xc2\xc3\xfc\xfd\xfe\xff\xf8\xf9\xfa\xfb\xf4\xf5\xf6\xf7\xf0\xf1\xf2\xf3\xec\xed\xee\xef\xe8\xe9\xea\xeb\xe4\xe5\xe6\xe7\xe0\xe1\xe2\xe3\x9c\x9d\x9e\x9f\x98\x99\x9a\x9b\x94\x95\x96\x97\x90\x91\x92\x93\x8c\x8d\x8e\x8f\x88\x89\x8a\x8b\x84\x85\x86\x87\x80\x81\x82\x83\xbc\xbd\xbe\xbf\xb8\xb9\xba\xbb\xb4\xb5\xb6\xb7\xb0\xb1\xb2\xb3\xac\xad\xae\xaf\xa8\xa9\xaa\xab\xa4\xa5\xa6\xa7\xa0\xa1\xa2\xa3'
>>> key.translate(trans_5C)
'=232%13)/z++*\x0f\to+/hhd\x14\x0em;-5\x12k\x12$\x084k'

2 つのステップのインターフェイスとして Web アプリケーションで使用するスクリプトに 2 つの関数を追加しました。関数は次のとおりです。

def requestTokenVerificationURL(user):
    if not user:
        raise Exception('requestTokenVerificationURL invoked without user argument')
    scope = 'https://mail.google.com/'
    nonce = None
    timestamp = None
    consumer_key = 'anonymous'
    consumer_secret = 'anonymous'
    consumer = OAuthEntity(consumer_key, consumer_secret)
    google_accounts_url_generator = GoogleAccountsUrlGenerator(user)
    authurl_token = GenerateRequestTokenAndAuthorizationURL(consumer, scope, nonce,
        timestamp, google_accounts_url_generator)
    return {'request_token_key': authurl_token['token'].key,
            'request_token_secret': authurl_token['token'].secret,
            'authorization_url': authurl_token['authorization_url'].strip()}


def generateAuthorizationTokenFromVerificationCode(user, verificationCode, request_key, request_secret):
    consumer_key = 'anonymous'
    consumer_secret = 'anonymous'
    consumer = OAuthEntity(consumer_key, consumer_secret)
    request_token = OAuthEntity(request_key, request_secret)
    google_accounts_url_generator = GoogleAccountsUrlGenerator(user)
    access_token = GetAccessToken(consumer, request_token, verificationCode,
        google_accounts_url_generator)
    return access_token

どんなヒットでも大歓迎です、事前に感謝します

4

1 に答える 1

0

問題が見つかりました!

この問題は、リクエスト トークンとシークレットがクライアントにやり取りされ、GET または POST リクエストから取得する過程で、django が文字列 (str) ではなく Unicode を返すという事実に関連していました。この問題は、Unicode をリクエスト トークン/シークレットの文字列に変換してから xoauth.py 関数に渡すことで解決されました。

これにより、他の誰かが 3 日間のテストを節約できることを願っています!

于 2013-01-30T16:37:02.817 に答える