0

我已经在 Google App Engine 上创建了一个应用程序,现在我正在转向安全性。我想把它锁定到只有几个 Ruby 客户端。我似乎找不到任何解释保护非 iOS/Android/JavaScript 文件的端点的地方。我想使用此处概述的身份验证我只是不明白如何为我的 Ruby 应用程序或尝试使用其 Web api 的客户端应用程序执行此操作。

4

1 回答 1

1

在 GAE 端,您需要为本地应用程序生成一个客户端 ID,并创建一个受 oAuth 保护的端点,生成的客户端 ID 填充在 allowed_client_ids 中。

这是一个示例 Python 端点:

import endpoints
import logging

from protorpc import messages
from protorpc import message_types
from protorpc import remote

CLIENT_ID = 'your_client_id_for_native_app'

class ServerRequestMSG(messages.Message):
    status = messages.StringField(1)

class ResponseMSG(messages.Message):
    message = messages.StringField(1)

@endpoints.api(name='localcall', version='v0.1',
                allowed_client_ids=[CLIENT_ID, endpoints.API_EXPLORER_CLIENT_ID],
                scopes=[endpoints.EMAIL_SCOPE],
                description='Local endpoints call test')
class LocalCallAPI(remote.Service):
    @endpoints.method(ServerRequestMSG, ResponseMSG,
                        path='authed', http_method='POST',
                        name='call.authed')
    def call_authed(self, request):
        current_user = endpoints.get_current_user()
        logging.info(request.status)
        email = (current_user.email() if current_user is not None
                 else 'Anonymous')
        return ResponseMSG(message='hello %s' % (email,))

app = endpoints.api_server([LocalCallAPI])

在客户端,您需要获取Google API Ruby Client。然后,您可以使用此示例调用受 oAuth 保护的端点:

require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/installed_app'

# Initialize the client.
client = Google::APIClient.new(
  :application_name => 'your_local_app_name',
  :application_version => 'app_version',
  :host => 'your_app_id.appspot.com',
  :discovery_path => '/_ah/api/discovery/v1'
)

# Initialize API.
service = client.discovered_api('localcall', 'v0.1')

# Run installed application flow.
flow = Google::APIClient::InstalledAppFlow.new(
  :client_id => 'your_client_id_for_native_app',
  :client_secret => 'client_secret_from_console',
  :scope => ['https://www.googleapis.com/auth/userinfo.email']
)
client.authorization = flow.authorize

# Make an API call.
result = client.execute(
  :api_method => service.call.authed,
  :parameters => {'status' => 'hello'}
)

如您所见,在调用您自己的 API 而不是 Google 的 API 时,您需要覆盖 host 和 discovery_path 值并设置 API 名称和版本。我认为它没有明确记录,但库允许它,这可以在检查库源后推断出来。

于 2015-02-13T15:08:48.230 回答