如何在Google Cloud Endpoints中检查服务到服务身份验证?

时间:2017-05-04 20:17:14

标签: google-app-engine oauth-2.0 google-cloud-endpoints microservices google-oauth2

我试图将整体Google App Engine应用程序(使用Python和标准环境)拆分为一个应用程序中的多个服务。默认服务是调用使用另一个服务中的端点框架实现的API。

除了我不了解如何正确检查默认服务的身份验证(并使其在本地开发服务器和生产中都可用)之外,一切都运行良好。

使用google-api-python-client和默认的应用程序凭据来调用服务。

from googleapiclient.discovery import build
from oauth2client.client import GoogleCredentials
service = build(
    name, version,
    credentials=GoogleCredentials.get_application_default(),
    discoveryServiceUrl=discovery_url)
service.client_token().execute()

我的服务API代码如下所示

@endpoints.api(
    name='test',
    version='v1',
)
class TestApi(remote.Service):

    @endpoints.method(
        message_types.VoidMessage,
        TestResponse,
        path='test',
        http_method='GET',
        name='test')
    def get_test(self, request):
        # user = endpoints.get_current_user()
        # if not user:
        #     raise endpoints.UnauthorizedException
        return TestResponse(test='test')

在生产中endpoints.get_current_user()似乎返回了正确的应用程序用户,但我不知道如何正确验证它是否是同一个应用程序。在本地开发环境中endpoints.get_current_user()返回None

1 个答案:

答案 0 :(得分:-1)

你做错了。您正在定义user,但未使用它。

以下示例向使用个性化消息和退出链接登录应用的用户表示问候。如果用户未登录,该应用会提供指向Google帐户登录页面的链接。

如果您使用from google.appengine.api import users模块:

def get(self):
    user = users.get_current_user()
    if user:
        nickname = user.nickname()
        logout_url = users.create_logout_url('/')
        greeting = 'Welcome, {}! (<a href="{}">sign out</a>)'.format(nickname, logout_url)
    else:
        login_url = users.create_login_url('/')
        greeting = '<a href="{}">Sign in</a>'.format(login_url)

    self.response.write('<html><body>{}</body></html>'.format(greeting))

创建user时,您仍需要检查它是否为空。 Plus user存储不同的值。所以你只需要打电话给他们并定义它们。

如果您的网页要求用户登录才能访问,您可以在app.yaml文件中强制执行此操作。

默认情况下,您的应用会使用Google帐户进行身份验证。要选择其他选项,例如Google Apps域,请转到Google Cloud Platform Console中的项目的settings页面,然后点击Edit。在Google身份验证dropdown menu中,选择所需的身份验证类型,然后点击Save

但您也可以使用Tipfy框架。