2010年7月14日 星期三

使用 OpenID 作為帳號驗證

AppEngine 在 1.3.4 版本之後,開始實驗支援 OpenID 的身份驗證,除了可以在建立 app 時選擇使用 OpenID 作帳號驗證之外,也可以在後台設定。


建立 app 時可以選擇使用 Open ID


在管理後台的 Administration > Application Settings 中設定

設定好了之後,其實程式也不用修改太多,還是可以直接使用 google.appengine.api.users 模組中的函式來做身份認證,App Engine 已經實作了 Open ID 的規格,所以可以根據 Open ID 找出認證網址,但首先要在 app.yaml 檔案中加入 /_ah/login_required 的 URL 像是這樣:
(app.yaml)
...
- url: /_ah/login_required
  script: openid_login.py
...

然後在你的登入頁面中,將登入的動作導向 /_ah/login_required 這個 URL,而處理的程式就像這樣:

(openid_login.py)...
from google.appengine.ext import webapp
from google.appengine.api import users

class OpenIdHandler(webapp.RequestHandler):
    def get(self):
        ....
        # 使用者輸入的 Open ID URL
        openid_url = self.request.get('openid')
        # Open ID 認證結束後導向的 URL
        continue_url = '....'
        # 將使用者導向 Open ID provider 的認證網址:
        self.redirect(users.create_login_url(continue_url, None, openid_url))
...
如果 openid_url 是空值,則 App Engine 會利用 Google Account API 來完成認證。

當使用者用 OpenID 認證成功之後,就可以使用利用下面的方式來取得使用者的 OpenID 資訊:

...
from google.appengine.api import users
...
user = users.get_current_user()
if user:
    # 取得 openid identity
    id = user.federated_identity()
    # 取得 openid provider URL
    provider = user.federated_provider()
...

沒有留言:

張貼留言