OAuth 2.0 для серверных приложений с использованием JavaScript

Я работаю с Google-bigquery и JavaScript уже некоторое время, получив некоторую помощь здесь, я понял, что вам требуются данные для входа в Google, связанные с проектом, для авторизации и выполнения того, что вы пытаетесь сделать.

Чего я пытаюсь достичь: - Разрешить пользователям посещать мою страницу и просматривать данные. Например, я могу показывать некоторые общедоступные данные на основе прогноза погоды, поэтому я не требую аутентификации пользователей,

В настоящее время я использую для исследований и разработок, я использую OAuth 2.0 для приложений веб-сервера, я хочу избавиться от этого, поскольку нам не нужны никакие пользовательские данные, кроме того, что у моего проекта клиент - id email-id и т.д ...

Я прочитал о OAuth 2.0 для серверных приложений. , и, похоже, нет никакой поддержки JavaScript, поэтому конечный пользователь не должен участвовать.

Есть ли какое-либо решение для этого или безопасное быстрое исправление, я попытался изменить код конфигурации из этого образца, чтобы увидеть, что произойдет, но не повезло -

var config = {
            'client_id' : 'xxxxxxxxxxx.apps.googleusercontent.com',
            "iss" : "[email protected]",
            "scope" : "https://www.googleapis.com/auth/bigquery",
            "aud" : "https://accounts.google.com/o/oauth2/token",
            "exp" : 1328554385,
            "iat" : 1328550785
        };

Что мне здесь не хватает.

Заранее спасибо за любую помощь и совет, я очень долго боролся с этим.


person shabeer90    schedule 14.08.2012    source источник


Ответы (1)


Поскольку нет способа скрыть секрет клиента в коде JavaScript на стороне клиента, нет способа авторизовать приложение JavaScript на стороне клиента для использования BigQuery через поток OAuth от сервера к серверу.

Единственное решение в этом случае - использовать прокси на стороне сервера для вызовов API из приложения JavaScript. Ниже приведен фрагмент того, как вы можете выполнять вызовы прокси-запросов через AppEngine (обратите внимание: приведенный ниже код открыт для любого пользователя, он выполняет любую проверку, чтобы убедиться, что вызовы выполняются через ваш конкретный клиент JavaScript).

import httplib2

from apiclient.discovery import build
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from oauth2client.appengine import AppAssertionCredentials

# BigQuery API Settings
SCOPE = 'https://www.googleapis.com/auth/bigquery'
PROJECT_ID = 'XXXXXXXXXX' # REPLACE WITH YOUR Project ID

# Create a new API service for interacting with BigQuery
credentials = AppAssertionCredentials(scope=SCOPE)
http = credentials.authorize(httplib2.Http())
bigquery_service = build('bigquery', 'v2', http=http)


class StartQueryHandler(webapp.RequestHandler):
  def post(self):
    query_string = self.request.get('query')
    jobCollection = bigquery_service.jobs()
    jobData = {
      'configuration': {
        'query': {
          'query': query_string,
        }
      }
    }
    try:
      insertResponse = jobCollection.insert(projectId=PROJECT_ID,
                                            body=jobData).execute()
      self.response.headers.add_header('content-type',
                                       'application/json',
                                       charset='utf-8')
      self.response.out.write(insertResponse)
    except:
      self.response.out.write('Error connecting to the BigQuery API')


class CheckQueryHandler(webapp.RequestHandler):
  def get(self, job_id):
    query_job = bigquery_service.jobs()
    try:
      queryReply = query_job.getQueryResults(projectId=PROJECT_ID,
                                             jobId=job_id).execute()
      self.response.headers.add_header('content-type',
                                       'application/json',
                                       charset='utf-8')
      self.response.out.write(queryReply)
    except:
      self.response.out.write('Error connecting to the BigQuery API')


application = webapp.WSGIApplication(
                                     [('/startquery(.*)', StartQueryHandler),
                                     ('/checkquery/(.*)', CheckQueryHandler)],
                                     debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()
person Michael Manoochehri    schedule 14.08.2012