0

对于“正常”的 oauth2 舞蹈,我可以指定用户并获得相应的令牌。这使我可以伪装成该用户(即代表他)进行 API 调用。

它还可以允许用户伪装成我来拨打电话。一个用例是 bigquery,我不必向用户授予表访问权限,我可以指定自己的首选控制级别。

使用简化的 OAuth2Decorator,我似乎没有这个选项。我这样说对吗?或者有解决办法吗?

一般来说,最佳实践是什么?使用正确的 oauth(包括 Flow、Credentials 和 Storage)?或者使用 OAuth2Decorator。

非常感谢。

4

2 回答 2

2

您当然可以使用 OAuth2Decorator

这是一个例子:

主文件

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 服务帐户 + 预测 API 文章中介绍了此类身份验证流程的示例。

另外,请参阅这部分这部分的 App Engine Datastore to BigQuery 代码实验室,它也使用这种授权方法。

代码可能如下所示:

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 回答