2016-07-28 12 views
4

HTTP APIを使ってFirebase DBにPython webappを書き込もうとしています(Google I/O 2016で発表された新しいバージョンのFirebaseを使用しています)。Firebase DB HTTP API認証:JWTトークンを更新する時期と方法

私の理解では、これまでの書き込みの特定の種類は、私はこのタイプのURLにPOSTリクエストで作られて実現したいということです。

https://my-project-id.firebaseio.com/{path-to-resource}.json

私が欠けている何かがありますauth part:正しく取得した場合は、JWTをHTTP AuthorizationヘッダーのAuthorization : Bearer {token}として渡す必要があります。

私はサービスアカウントを作成し、その秘密鍵をダウンロードしてJWTを生成するために使用し、リクエストヘッダーに追加してリクエストが正常にFirebase DBに書き込まれました。

これで、JWTの有効期限が切れ、firebase DBに対する同様の要求がすべて失敗しました。

私は新しいトークンを生成するはずですが、問題は次のとおりです。トークンの生成とリフレッシュを処理することを期待していませんでした。ほとんどのHTTP APIリクエストで渡される静的なapiキー私のWebアプリケーションは、stati apiキー文字列をリクエストに追加するだけで、比較的簡単に保つことができます。

トークンの生成と有効期限を考慮する必要がある場合は、Webアプリケーションのロジックが複雑になる必要があります(トークンを保存して、トークンを有効にしていない場合は新しいトークンを生成する必要があるため)私はちょうどすべての要求のための新しいトークンを生成することができます(しかし、これは本当に理にかなっていますか?)。

この点についてはベストプラクティスがあるのか​​、このトピックに関するドキュメントから何か不足している場合は知りたいと思います。新しいJWTが生成されるすべての要求のために現在

import requests 
import json 
from oauth2client.service_account import ServiceAccountCredentials 

_BASE_URL = 'https://my-app-id.firebaseio.com' 
_SCOPES = [ 
    'https://www.googleapis.com/auth/userinfo.email', 
    'https://www.googleapis.com/auth/firebase.database' 
] 

def _get_credentials(): 
    credentials = ServiceAccountCredentials.from_json_keyfile_name('my_service_account_key.json', scopes=_SCOPES) 
    return credentials.get_access_token().access_token 

def post_object(): 
    url = _BASE_URL + '/path/to/write/to.json' 

    headers = { 
     'Authorization': 'Bearer '+ _get_credentials(), 
     'Content-Type': 'application/json' 
    } 

    payload = { 
       'title': title, 
       'message': alert 
       } 

    return requests.post(url, 
         data=json.dumps(payload), 
         headers=headers) 

おかげで、 マルコ


補遺

は、これは私が現在実行しているコードです。それは私には最適ではないようです。有効期限のないトークンを生成することは可能ですか?

+0

これはおそらくサーバー側のアクセスですか?あなたが実際にやりたいことは、サービスアカウントから生成されたGoogleアクセストークンを使用することです。 [ここに例があります](http://stackoverflow.com/questions/37539066/how-to-authenticate-in-ruby-via-rest-api/38535125#38535125)Rubyでそれを行う方法について説明します。 –

+0

はい、サーバー側のアクセス用です。私がやったことが質問文に追加されました。すべてのリクエストで新しいJWTを生成しているので、最適ではないと私はまだ感じていますが。サーバー側のアクセスのために、静的な(期限切れでない)トークンを使用することを望んでいました。 –

+0

3.x SDKでは、セキュリティ上の理由から、1つの長命ベアラトークンを許可しなくなりました。 –

答えて

0

ありがとうコード例です。 httpの認証されたラッパーを作成するcredentials.authorize関数を使用すると、よりうまく動作します。

from oauth2client.service_account import ServiceAccountCredentials 
from httplib2 import Http 
import json 

_BASE_URL = 'https://my-app-id.firebaseio.com' 
_SCOPES = [ 
    'https://www.googleapis.com/auth/userinfo.email', 
    'https://www.googleapis.com/auth/firebase.database' 
] 

# Get the credentials to make an authorized call to firebase  
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    _KEY_FILE_PATH, scopes=_SCOPES) 

# Wrap the http in the credentials. All subsequent calls are authenticated 
http_auth = credentials.authorize(Http()) 

def post_object(path, objectToSave): 
    url = _BASE_URL + path 

    resp, content = http_auth.request(
     uri=url, 
     method='POST', 
     headers={'Content-Type': 'application/json'}, 
     body=json.dumps(objectToSave), 
) 

    return content 

objectToPost = { 
    'title': "title", 
    'message': "alert" 
} 

print post_object('/path/to/write/to.json', objectToPost) 
関連する問題