2016-07-28 2 views
4

HTTP API를 사용하여 파이어 폭스 DB에 파이썬 웹 애플리케이션을 작성하려고합니다 (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 : Bearer {token}으로 전달되어야합니다.

그래서 서비스 계정을 만들고 비공개 키를 다운로드하여 JWT를 생성하고 요청 헤더에 추가하면 요청이 Firebase DB에 성공적으로 기록됩니다.

이제 JWT가 만료되었으며 파이어베이스 DB에 대한 유사한 요청이 실패합니다.

물론 새 토큰을 생성해야하지만 질문은 다음과 같습니다. 토큰 생성을 처리하지 않아도되고 대부분의 HTTP API가 요청에서 전달되는 정적 API 키를 요구하는 데 사용되는 대부분의 HTTP API 그래서 내 webapps는 요청에 stati api 키 문자열을 추가하는 것만으로도 비교적 간단하게 유지할 수 있습니다.

토큰 생성 및 만료를 처리해야한다면 webapp 논리가 복잡해집니다 (토큰을 저장하고 유효한지 확인한 다음 유효하지 않은 경우 새 값을 생성해야하기 때문에). 모든 요청에 ​​대해 새 토큰을 생성 할 수는 있습니다 (하지만 실제로이 의미가 있습니까?).

이 점에 대해 따라야 할 최선의 방법이 있는지 또는이 항목과 관련된 설명서에서 뭔가 빠졌는지 알고 싶습니다. 새로운 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) 루비에서 어떻게하는지. –

+0

예, 서버 측 액세스 용입니다. 내가 한 일은 질문 문안에 추가되었습니다. 모든 요청에 ​​대해 새로운 JWT를 생성하고 있기 때문에 여전히 최적이 아니라고 생각합니다. 서버 측 접근을 위해서 나는 정적 (비 만료되지 않는) 토큰을 사용할 수 있기를 바랬다. –

+0

3.x SDK에서 보안상의 이유로 더 이상 하나의 수명이 긴 무기명 토큰을 허용하지 않습니다. –

답변

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) 
관련 문제