0

「通常の」oauth2 ダンスでは、ユーザーを指定して、対応するトークンを取得します。これにより、そのユーザーになりすまして、つまりそのユーザーに代わって API 呼び出しを行うことができます。

また、ユーザーが自分になりすまして電話をかけることもできます。ユーザーにテーブルへのアクセス権を付与する必要がなく、好みの制御レベルを指定できる bigquery のユース ケースがあります。

簡素化された OAuth2Decorator を使用すると、このオプションがないようです。私がそう言うのは正しいですか?または回避策はありますか?

一般的に、ベストプラクティスは何ですか? 適切な oauth (フロー、資格情報、およびストレージで構成される) を使用するには? または、OAuth2Decorator を使用します。

どうもありがとうございました。

4

2 に答える 2

2

確かに OAuth2Decorator を使用できます

次に例を示します。

main.py

import bqclient
import httplib2
import os

from django.utils import simplejson as json
from google.appengine.api import memcache
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from oauth2client.appengine import oauth2decorator_from_clientsecrets

PROJECT_ID = "xxxxxxxxxxx"
DATASET = "your_dataset"

QUERY = "select columns from dataset.table"

CLIENT_SECRETS = os.path.join(os.path.dirname(__file__),'client_secrets.json')

http = httplib2.Http(memcache)
decorator = oauth2decorator_from_clientsecrets(CLIENT_SECRETS,
                  'https://www.googleapis.com/auth/bigquery')

bq = bqclient.BigQueryClient(http, decorator)

class MainHandler(webapp.RequestHandler):
    @decorator.oauth_required
    def get(self):
     data = {'data': json.dumps(bq.Query(QUERY, PROJECT_ID))}
     template = os.path.join(os.path.dirname(__file__), 'index.html')
     self.response.out.write(render(template, data))

application = webapp.WSGIApplication([('/', MainHandler),], debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

BigQuery アクションを処理する main.py にインポートされる bqclient.py

from apiclient.discovery import build

class BigQueryClient(object):
    def __init__(self, http, decorator):
        """Creates the BigQuery client connection"""
        self.service = build('bigquery', 'v2', http=http)
        self.decorator = decorator

    def Query(self, query, project, timeout_ms=10):
        query_config = {
            'query': query,
            'timeoutMs': timeout_ms
         }
         decorated = self.decorator.http()
         queryReply = (self.service.jobs()
             .query(projectId=project, body=query_config)
             .execute(decorated))
         jobReference=queryReply['jobReference']
         while(not queryReply['jobComplete']):
             queryReply = self.service.jobs().getQueryResults(
                 projectId=jobReference['projectId'],
                 jobId=jobReference['jobId'],
                 timeoutMs=timeout_ms).execute(decorated)
         return queryReply

すべての認証の詳細は、json ファイル client_secrets.json に保持されます。

{
    "web": {
        "client_id": "xxxxxxxxxxxxxxx",
        "client_secret": "xxxxxxxxxxxxxxx",
        "redirect_uris": ["http://localhost:8080/oauth2callback"],
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://accounts.google.com/o/oauth2/token"
    }
}

最後に、次の行を app.yaml に追加することを忘れないでください。

- url: /oauth2callback
  script: oauth2client/appengine.py

それが役立つことを願っています。

于 2012-07-16T16:20:46.983 に答える
0

ユースケースを完全に理解しているかどうかはわかりませんが、自分の資格情報に基づいてアクセスを承認することなく、他のユーザーが使用できるアプリケーションを作成している場合は、App Engine サービス アカウントを使用することをお勧めします。

このタイプの認証フローの例は、App Engine サービス アカウント + Prediction API の記事で説明されています。

また、この承認方法も使用する App Engine Datastore to BigQuery Codelab のこの部分この部分も参照してください。

コードは次のようになります。

import httplib2

# Available in the google-api-python-client lib
from apiclient.discovery import build
from oauth2client.appengine import AppAssertionCredentials

# BigQuery Scope
SCOPE = 'https://www.googleapis.com/auth/bigquery'

# Instantiate and authorize a BigQuery API client
credentials = AppAssertionCredentials(scope=SCOPE)
http = credentials.authorize(httplib2.Http())
bigquery_service = build("bigquery", "v2", http=http)

# Make some calls to the API
jobs = bigquery_service.jobs()
result = jobs.insert(projectId='some_project_id',body='etc, etc')
于 2012-07-23T21:01:11.363 に答える