我已经使用Google App Engine构建了一个与Web客户端通信的自定义端点API,并且我已经使用API资源管理器和Web客户端成功测试了它。
现在,我正在尝试使用instructions通过这些web client ID向云端点API添加身份验证。我可以使身份验证工作,但无法使身份验证 required 。
WEB_CLIENT_ID = # Some Client ID
@endpoints.api(name="AppApi", version="v1", allowed_client_ids=[WEB_CLIENT_ID], audiences=[WEB_CLIENT_ID], scopes=[endpoints.EMAIL_SCOPE])
class AppApi(remote.Service):
@endpoints.method(TestRequestMessage, TestResponseMessage, name="test.get", path="test/get")
def TestGet(self, request):
response = TestResponseMessage()
# Return a blank response message
return response
我故意尝试排除endpoints.API_EXPLORER_CLIENT_ID
中的allowed_client_ids
,因为我想确保它对于未使用API资源管理器进行身份验证的请求会失败。
当我访问API资源管理器时,我可以成功请求而无需身份验证。当我使用API资源管理器启用身份验证时,它会要求我启用电子邮件身份验证,这样就可以了,但它不需要对呼叫进行身份验证。
如何让Google Cloud Endpoints API要求每次通话都进行身份验证?
我也没有使用API进行任何用户特定的工作,所以我只是尝试使用Web客户端身份验证使用Web客户端身份验证,因此它是Web客户端请求信息。没有用户登录。
答案 0 :(得分:1)
在处理端点时需要考虑两个身份验证层:
客户端ID层,它管理来自哪里的代码,客户端ID /机密可以调用API。您可以阅读有关此here。
用户身份验证层,用于管理OAuth2.0用于Login / OpenID Connect(同一事物)流程,其中用户向应用程序授予https://www.googleapis.com/auth/userinfo.email
范围,并且应用程序发送Bearer令牌对于每个API请求,以便端点服务器可以使用该令牌来获取代表其发出请求的用户的配置文件信息。您可以在文档中详细了解有关端点的用户身份验证层(java / python)
如果我理解您的帖子,您的问题与您即使API资源管理器的客户端ID不在允许的ID列表中也可以发出API Explorer请求有关。这是一个已知的问题,我认为已在public issue tracker中提及,因此正在进行中,可能具有高度优先性。
至少,知道它不是你自己的错误的结果应该让你安心并继续发展,知道它会很快修复,并且不会表示安全风险,因为只有您可以访问自己项目的API Explorer。
答案 1 :(得分:0)
Cloud Endpoints不会自动启用身份验证。通过注释,您已标记用于安全访问的API方法。
每次通话您需要做的是检查用户对象并确定是否:
如果它不符合您的身份验证和授权要求,您应该有适当的逻辑来返回正确的HTTP错误代码或其他一些数据,如果它是匿名访问类型。
在说明中,这是第3点:“将当前用户检查(endpoints.get_current_user)添加到您希望保护的每个方法。”