Google App Engine で実行されている Python アプリケーションへのログインを、OpenID を使用して特定の Google Apps ドメインのメンバーに制限したいと考えています。
スレッドによると、Google Federated Login を特定の Apps ドメインに制限するにはどうすればよいですか? これは、通常の Google openid 認証 URL を置き換えるだけで実現できます。
と
ただし、これは GAE for Python で users.create_login_url() を使用しても機能しないようです。Google アプリ エンジンのログには表示されない 500 サーバー エラーがスローされます (ログには、logging.debug からのリダイレクトと "OpenID" のみが表示されます)。
これを修正する方法について何か提案はありますか?
app.yaml
application: example
version: 1
runtime: python27
api_version: 1
threadsafe: yes
handlers:
- url: /_ah/login_required
script: main.app
- url: .*
script: main.app
login: required
main.py:
import webapp2, logging
from google.appengine.api import users
# Any google account, works like a charm
#federated_identity='https://www.google.com/accounts/o8/id'
# only accounts under spefific domain, does not work
federated_identity='https://google.com/accounts/o8/site-xrds?hd=example.com'
dest_url = 'http://example.appspot.com/'
class Main(webapp2.RequestHandler):
def get(self):
logging.debug('Main')
user = users.get_current_user()
if user:
self.response.out.write('Hello %s<p>[<a href="%s">log out</a>]' % (user.email(),
users.create_logout_url(self.request.uri)))
else:
self.response.out.write('Not logged in')
class OpenID(webapp2.RequestHandler):
def get(self):
logging.debug('OpenID')
login_url = users.create_login_url(dest_url=dest_url,
federated_identity=federated_identity)
self.redirect(login_url)
app = webapp2.WSGIApplication([
('/_ah/login_required', OpenID),
('/', Main)
], debug=True)
Update
Sebastian は、フェデレーション ID を URL エンコードすることで解決できる可能性があることを示唆しています。提案されているように、URL全体または疑問符のみをURLエンコードしてみました。残念ながら、これは何も変わりません。ブラウザーのアドレス バーに表示されるリダイレクト URL、またはログに書き込まれた場合のリダイレクト URL: