我试图将整体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
。
答案 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框架。