1

oAuth2WebServerFlow を使用して oAuth アクセス トークンを取得し、ユーザーの連絡先のリストを取得しています。Web フレームワークとして web2py を使用しています。

    flow = oauth2client.client.OAuth2WebServerFlow(client_id=CLIENT_ID,
                                                   client_secret=CLIENT_SECRET,
                                                  scope='https://www.google.com/m8/feeds', 
                                                   user_agent=USER_AGENT)
    callback = 'http://127.0.0.1:8000/Test/searcher/oauth2callback'
    authorise_url = flow.step1_get_authorize_url(callback)
    session.flow = pickle.dumps(flow)
    redirect(authorise_url) 

リダイレクトを使用すると、次のように処理されます

flow = pickle.loads(session.flow)
credentials = flow.step2_exchange(request.vars) 

私の質問は、上記で返された OAuth2Credentials オブジェクトを OAuth2AccessToken オブジェクトに変更する方法です。これを使用して、次のような連絡先ライブラリへのリクエストを承認できます。

gc = gdata.contacts.client.ContactsClient(source="")
token.authorize(gc)
gc.GetContacts

さまざまな方法を試しましたが、成功しませんでした。通常、「Invalid Grant」という oAuth2AccessTokenError メッセージが表示されます。このようなものがうまくいくかもしれないと思っていますが、もっと簡単な方法が必要だと思います!

token = gdata.gauth.OAuth2Token(client_id=CLIENT_ID, client_secret=CLIENT_SECRET, scope='https://www.google.com/m8/feeds', user_agent=USER_AGENT)

    token.redirect_uri = 'http://127.0.0.1:8000/Test/searcher/oauth2callback'
    token.get_access_token(<<code to pass the access_token out of the Credentials object??>>)

誰でもこれを手伝ってもらえますか?

4

2 に答える 2

4

私はこれを機能させることができました。実際には非常に簡単でした.OAuth2WebServerFlowの使用をやめただけですが、とにかくあまり価値がないように見えました. したがって、新しいコードは次のようになります。

token = gdata.gauth.OAuth2Token(client_id, client_secret, scope, ua)
session.token = pickle.dumps(token)                   
redirect(token.generate_authorize_url(redirect_uri='http://127.0.0.1:8000/Test/default/oauth2callback'))

に続く

def oauth2callback():
    token = pickle.loads(session.token)
    token.redirect_uri='http://127.0.0.1:8000/Test/default/oauth2callback'
    token.get_access_token(request.vars.code)
    gc = gdata.contacts.client.ContactsClient(source='')
    gc = token.authorize(gc)
    feed = gc.GetContacts()

これが誰かに役立つことを願っています!

于 2012-07-08T18:31:02.490 に答える
1

新しい OAuth2.0 API を正しくセットアップするためのコードがあると仮定すると、Credentials -> Token クラスを変換するヘッダーを変更する Token クラスを作成することで、これを機能させることができます。

OAUTH_LABEL='OAuth '

#Transforms OAuth2 credentials to OAuth2 token.
class OAuthCred2Token(object):

    def __init__(self, token_string):
        self.token_string = token_string

    def modify_request(self, http_request):
        http_request.headers['Authorization'] = '%s%s' % (OAUTH_LABEL,
                                                          self.token_string)

    ModifyRequest = modify_request

次のようにテストできます。

gc = gdata.contacts.client.ContactsClient(source='')
token = OAuthCred2Token(creds.access_token)
gc.auth_token = token
print gc.GetContacts()

このコードは、認証情報を使用するコードが処理するトークンの更新を処理しないことに注意してください。私自身のアプリケーションでは、連絡先を取得するための呼び出しを行う前に、資格情報を更新するサービスを使用して単純な呼び出しを行うことは許容されます。

于 2013-02-17T08:02:33.560 に答える