OAuth in GAE

因為需要用到Google的某個service, 而那個service需要用OAuth認證, 最近研究了一下OAuth2要如何在GAE上用. 身為OAuth2推手之一的Google, 在推廣OAuth2及提供對應的Tools來說, 盡了很大的心力. 以python來說, 它就提供了google-api-python-client這個library, 可以很容易的使用OAuth. 我參考了這份文件實驗成功使用OAuth2了, 特別記錄一下.

  • 安裝
    • 在Linux與MacOS下十分簡單, 只要'sudo easy_install --upgrade google-api-python-client'即可安裝完成. Windows下就哭哭了, 但是最後的成果是可以在Windows下的dev_appserver.py裡執行的.
  • Google APIs Console裡註冊你的AP
    1. 在左邊的下拉選單裡新增一個Project.
    2. 在Service那欄裡找出對應的API, 把它切換成On.
    3. 點API Access.
    4. 點Create on OAuth 2.0 client ID.
    5. 因為是GAE, 選Web application. Hostname可以先打localhost.
    6. 點Create後, 會產生三個像密碼一樣的東西, 兩個link. 把它們抄寫到一個叫settings.py的檔裡. 等等會用到.
CLIENT_ID='把那串密碼裡的Client ID填在這'
CLIENT_SECRET='把那串密碼裡的Client secret填在這'
SCOPE='' #這是要使用的API應該會提供的資訊, 從API的文件取得.
  • 在安裝完google-api-python-client後, 會在/usr/local/bin裡裝一個enable-app-engine-project的script. 如果已經有把/usr/local/bin加入PATH的話, 直接執行後面加project目錄即可.
    • e.g. enable-app-engine-project ./
  • 上面那段command會複製一大堆目錄檔案過來, 把你的目錄搞的亂七八糟, 不過就將就著用吧.
    • 多建了apiclient, httplib2, oauth2, oauth2client, uritemplate等五個目錄及copy了gflags會用到的兩個檔案.
  • 接下來就可以修改原始GAE產生的main.py了. 範例中還是用python 2.7之前的webapp, 現在我改用python 2.7 runtime建議使用的webapp2.
from apiclient.discovery import build
import httplib2
from oauth2client.appengine import OAuth2Decorator
import settings

decorator = OAuth2Decorator(client_id = settings.CLIENT_ID,
                            client_secret = settings.CLIENT_SECRET,
                            scope = settings.SCOPE,
                            user_agent = 'mactest')

class MainHandler(webapp2.RequestHandler):

    @decorator.oauth_required
    def get(self):
        h = decorator.http()

        resp, content = h.request(URL) # URL是該API用的, 從API文件查.

  • 接下來改app.yaml
  • handlers:
    - url: /oauth2callback
      script: oauth2client/appengine.py
    - url: .*
      script: main.py
    
  • 如此一來, 在連往http://localhost:8080的時候, 會去call MainHandler.get(), decorator.oauth_required會檢查目前是否已經login google account, 如果沒有, 會先redirect到login畫面. login之後會再redirect到oauth認證畫面. 如果User按下OK, 這個OAuth2 client會藉此取得token. 而透過decorator.http()取得的http handle, 它預設已經把OAuth2會用到header加進去了, 也自動會處理token expire後重新request的動作. 在程式碼中只要當作一般的httplib handle用即可.
  • 測試完成在deploy前, 再回到api console把剛才打localhost的東西改成真的網址. 再用appcfg.py update上傳即可.
以上的例子, 這個GAE AP就可以用user的身份去取得該身份才能使用的service. 而我現在的問題是不管誰用這個GAE AP, 都要用我的身份去使用該service(因為Google只開那個service的使用權給我). 所以我將不能直接用@decorator.oauth_required. 該怎麼做呢? 請看下一篇.

留言

這個網誌中的熱門文章

買車記

怎麼在兩台linux server間用scp而不需打密碼?

Costco退貨真爽快