5

Google App Engine で学校新聞の記事割り当てシステムを完成させようとしています。ライターの締め切りを追跡し、ライターが記事をピックアップできるようにし、週ごとの記事を「一目で」確認できるようにします。パートナーと私は、新聞の Google Apps インストールと完全に統合しようとしています。Google Apps Premier がないため、3-legged Oauth を使用する必要があります。

その努力の中で、私は Aeoid に出くわし、指示に従ってフェデレーテッド ログインを機能させることができました。とても良いですね!

問題が発生しているのは、Oauth を使用してユーザーの Google ドキュメントのリストを取得することです。ここにテスト ページを設定しました: mustrun.cornellsun.com/test。エラーが表示されます - このメールの下部にコピーしました。これが私のコンシューマ シークレットに関係しているかどうかはわかりません (Google マーケットプレイスから取得したキーを使用する必要がありますか?それとも、ドメインの管理ページから取得したキーを使用する必要がありますか?)。現在、ドメインの管理ページから取得したキーを使用しています

また、これを複雑にしているのは、実際の appspot ドメインが mustrun2sun [].appspot[too new can't post multiple link].com であることですが、Google アプリで設定して、自分のドメインのユーザーのみがログインできるようにしました。アプリが私のドメインに展開されるようにします。(アプリは次のように展開されmust[]run[].corn[]ellsun[].[]com、ドメインの管理でもすべてがそのように参照されます。)

私は GDClient 2.0 クラスを使用しているので、すべてが計画どおりに機能するはずだと確信しています...つまり、古いサービスなどは使用していません。htt[]p:/[]/k[]ing[]yo-bachi.blog[]spot.c[]om/2010/05/gaego[]ogleoauth.ht[]mlGoogle の例は古く、古い Google データ 1.0 ライブラリを使用しているため、Oauth の「ダンス」のテンプレートとして少し使用しました。

テストページに移動したときに発生するエラーは

Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 511, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/mustrun2sun/1.341947133742569880/main.py", line 170, in get
    feed = client.GetDocList(auth_token=gdata.gauth.AeLoad(users.get_current_user().user_id())) #auth_token=TOKEN
  File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/docs/client.py", line 141, in get_doclist
    auth_token=auth_token, **kwargs)
  File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/client.py", line 635, in get_feed
    **kwargs)
  File "/base/data/home/apps/mustrun2sun/1.341947133742569880/gdata/client.py", line 308, in request
    response, Unauthorized)
Unauthorized: Unauthorized - Server responded with: 401, <HTML>
<HEAD>
<TITLE>Token invalid - Invalid AuthSub token.</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Token invalid - Invalid AuthSub token.</H1>
<H2>Error 401</H2>
</BODY>
</HTML>

また、これはソース コードがないと難しいため、関連するコードを以下に示します。

import gdata.auth
import gdata.gauth
import gdata.docs.client
import gdata.docs.data
import gdata.docs.service
import gdata.alt.appengine

from aeoid import middleware, users

class GetOauthToken(webapp.RequestHandler):
    def get(self):
        user_id = users.get_current_user().user_id()
        saved_request_token = gdata.gauth.AeLoad("tmp_"+user_id)
        gdata.gauth.AeDelete ("tmp_" + user_id)
        request_token = gdata.gauth.AuthorizeRequestToken(saved_request_token, self.request.uri)
        #upgrade the token
        access_token = client.GetAccessToken(request_token)
        #save the upgraded token
        gdata.gauth.AeSave(access_token, user_id)
        self.redirect('/test')     

class Test(webapp.RequestHandler):
    def get(self):
        TOKEN = gdata.gauth.AeLoad(users.get_current_user().user_id())
        if TOKEN:
            client = gdata.docs.client.DocsClient(source=SETTINGS['APP_NAME'])
            client.auth_token = gdata.gauth.AeLoad(users.get_current_user().user_id()) #could try to put back as TOKEN?

            self.response.out.write('moo baby')
            client.ssl = True
            feed = client.GetDocList(auth_token=gdata.gauth.AeLoad(users.get_current_user().user_id())) #auth_token=TOKEN
            self.response.out.write(feed)
            self.response.out.write('moo boobob')
            self.response.headers['Content-Type'] = 'text/plain'
            for entry in feed.entry:
                self.response.out.writeln(entry.title.text)
        else:
            # Get unauthorized request token
            gdata.gauth.AeDelete(users.get_current_user().user_id())
            client = gdata.docs.client.DocsClient(source=SETTINGS['APP_NAME'])
            client.ssl = True # Force communication through HTTPS

            oauth_callback_url = ('http://%s/get_oauth_token' %
                                  self.request.host)

            request_token = client.GetOAuthToken(
                SETTINGS['SCOPES'], oauth_callback_url, SETTINGS['CONSUMER_KEY'],
                consumer_secret=SETTINGS['CONSUMER_SECRET'])
            gdata.gauth.AeSave(request_token, "tmp_"+users.get_current_user().user_id())
            # Authorize request token
            domain = None#'cornellsun.com'
            self.redirect(str(request_token.generate_authorization_url(google_apps_domain=domain)))

私は答えを求めてウェブ上で高低を探してきましたが、見つけることができませんでした。

4

3 に答える 3

3

OpenIDとOAuthを使用してGoogleの連絡先を取得するPythonAppEngineアプリがあります。

http://github.com/sje397/Chess

それはで実行されています:

http://your-move.appspot.com

App EngineにはOpenIDサポートが組み込まれているため、Aeoidは不要になっていることに注意してください。

于 2010-07-20T07:14:26.497 に答える
1

URL が正しくない場合にも 401 が返されるということで、数時間を無駄にしていることがわかりました。

私の例では、私はやっていた

.../buzz/v1/activities/@me/@self**?&**alt=json

それ以外の

.../buzz/v1/activities/@me/@self**?**alt=json
于 2010-10-30T04:46:02.377 に答える
0

私は個人的にOAuthを使用していませんが、役立つ可能性がある(または役に立たない可能性がある)ことに気付いたいくつかのことがあります。

  1. 401エラーはHTTP401エラーである可能性があります。これは、URLは有効でしたが、認証が必要であることを意味します。これは明らかにOAuthの試行の失敗によって説明されますが、ログインしていないユーザーを別のページにリダイレクトすることも重要な場合があります。

  2. フィード変数を割り当てるときにエラーが発生しています。auth_tokenパラメーターは単にユーザー名であると想定されていますか?

3.回線を使用しています。

gdata.gauth.AeLoad(users.get_current_user().user_id())

頻繁に。認証の問題とは関係がないかもしれませんが、このクエリを1回作成して、変数に格納する方がよいでしょう。その後、再び必要になったときに、その方法でアクセスします。それはあなたのアプリケーションの速度を改善します。

繰り返しになりますが、特定のOAuthの経験がないことをお詫び申し上げます。私はちょうどあなたを正しい道に導くかもしれないいくつかのものをスキャンして見つけようとしました。

于 2010-05-19T01:59:48.767 に答える