GAEアプリケーションでAlexのSimpleAuth(https://github.com/crhym3/simpleauth)を使用しています。ベーステンプレートにJqueryPoweredLoginボックスがあります。これは、ユーザーがアプリケーション内の任意のURLからログインできることを意味します。ログインを要求したページにユーザーをリダイレクトしてもらいたい。Oauth2でこれを実現する方法はありますか、それともユーザーを特定のURLのみにリダイレクトする方法はありますか?
2 に答える
SimpleAuthを使用している場合は、おそらくwebapp2を使用していると思います。したがって、@ jmort253の例は、私が行う方法とは異なります(たとえば、webapp2にはセッションが組み込まれているので、セッション処理にさらに別のライブラリを使用する必要があります)。
ただし、概念的には正しいです。必要なのは、認証プロセスを開始する前に、セッションのどこかに元のURLを保存することです。次に、認証が成功した後、その保存されたURLを最終的なリダイレクトに使用します。
SimpleAuthのサンプルアプリコードから始めて、基本的に変更する必要があるのは、ユーザーを('/ profile'ではなく)元のURLにリダイレクトするための_on_signin()の最後の行です。
元のリクエストURLを保存するには、単純なラッパーを使用できます。
def simpleauth_login_required(handler_method):
"""A decorator to require that a user be logged in to access a handler.
To use it, decorate your get() method like this:
@simpleauth_login_required
def get(self):
user = self.current_user
self.response.out.write('Hello, ' + user.name())
"""
def check_login(self, *args, **kwargs):
if self.request.method != 'GET':
self.abort(400, detail='The login_required decorator '
'can only be used for GET requests.')
if self.logged_in:
handler_method(self, *args, **kwargs)
else:
self.session['original_url'] = self.request.url
self.redirect('/my-login-page-where-users-can-choose-auth-method')
return check_login
self.redirect('/profile')
ここで、次のようなことを行う代わりに、その_on_signin()リダイレクト行に戻ります。
target = self.session['original_url']
self.redirect(target)
いくつかのメモ:
logged_in
上記の例では、現在のリクエストがすでに認証されたユーザーによって行われたかどうかを示すメソッドがあることを前提としています。- セッションから「original_url」をクリアすることをお勧めします(認証に成功した場合)
上記の例のクレジットは、webapp2_extras.appengine.usersモジュールに送られます。
ユーザーがログインしようとすると、アプリは最初にアクセストークンをリクエストし、次にGoogleOAuth2URLを作成します。アプリはユーザーをgoogle.comにリダイレクトし、そこでユーザーはログインする必要があります。このログインURLには、サーバーからGoogleへのリクエストからのアクセストークンが含まれています。セキュリティ上の理由から、そのリダイレクトURLに関連付けられています。
このリダイレクトURLは、正常なログイン操作をアプリに返すことでログインプロセスを完了するように設計されています。これにより、ユーザーのログイン、ユーザーの登録、またはアプリで必要な操作をすべて完了することができます。
その後、ボールはコートにあり、アプリをプログラムして好きなことをすることができます。言い換えれば、Googleは安全なエンドポイントへのリクエストの取得だけを気にします。それが完了すると、Googleはあなたが何をするかを気にしなくなります。それはあなたのアプリです。
したがって、ユーザーがログインする前に表示していたページにリダイレクトすることは、使いやすさの大幅な向上であり、次のことを行う必要があります。
ユーザーをリダイレクトする手順:
1ユーザーがログインする前に、ユーザーがアクセスしているページをセッションに保存します。
session = appengine_utilities.sessions.Session()
session["target_url"] = "/example_page.html" # sets keyname to current page
2次に、先に進み、通常どおりユーザーをログインさせます。
3 Googleがユーザーを認証リダイレクトURLにリダイレクトした後、セッションからターゲットURLを取得します。
target_url = session['target_url']
4最後に、ユーザーをこのURLにリダイレクトします。
つまり、最初にGoogleから単一の確立されたリダイレクトURLへのリダイレクトを受け入れる限り、ユーザーを任意のターゲットURLにリダイレクトするという目標を達成できます。
セッションの例は、ビーカーのWebサイトからのものです。さらに、Appengine Part5のブログ記事に関するNickJohnsonのWebappsは、Beakerとのセッションに飛び込んでいます。