Cloud Endpoints 不需要身份验证

Cloud Endpoints won't require authentication

我使用 Google App Engine 构建了一个自定义端点 API,它与 Web 客户端进行通信,并且我已经使用 API 资源管理器和 Web 成功测试了它客户.

现在我正尝试通过这些 instructions, using web client ID 向云端点 API 添加身份验证。我可以让身份验证工作,但无法让身份验证成为 必需的

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

我故意尝试在 allowed_client_ids 中排除 endpoints.API_EXPLORER_CLIENT_ID,因为我想确保它不会因未通过 API Explorer 验证的请求而失败。

不过,当我转到 API 浏览器时,我可以在 无需 身份验证的情况下成功发出请求。当我使用 API 资源管理器打开身份验证时,它会要求我启用电子邮件身份验证,这样就可以了,但它不需要对调用进行身份验证。

如何让 Google 云端点 API 要求每次调用都进行身份验证?

我也没有对 API 进行任何特定于用户的工作,所以我只是尝试使用 Web 客户端凭据进行 Web 客户端身份验证,以便它是 Web 客户端请求信息。没有用户登录。

Cloud Endpoints 本身不会自动启用身份验证。通过注释,您已将 API 方法标记为安全访问。

每次调用您需要做的是检查用户对象并确定是否:

  • 这是一个有效的用户
  • 对用户进行自己的授权检查

如果它不符合您的身份验证和授权要求,您应该有适当的逻辑来 return 正确的 HTTP 错误代码或一些其他数据(如果是匿名访问)。

在说明中,这是第 3 点的具体说明:"Add a current user check (endpoints.get_current_user) to each method you wish to protect."

处理端点时需要考虑两个身份验证层:

  • Client ID层,它管理什么代码来自哪里,用什么ClientID/secrets可以调用API。你可以阅读这个 here.

  • 用户身份验证层,它管理 OAuth2.0 For Login/OpenID 连接(同一事物)过程,在该过程中用户授予应用程序 https://www.googleapis.com/auth/userinfo.email 范围,以及应用程序随每个 API 请求一起发送 Bearer 令牌,以便端点服务器可以使用该令牌来获取代表其发出请求的用户的个人资料信息。您可以在文档 (java/python)

  • 中阅读有关端点的用户身份验证层的更多信息

如果我理解你的 post,你的问题与这样一个事实有关,即使 API Explorer 的客户端 ID 不在列表中,你也可以发出 API Explorer 请求允许的 ID。这是一个已知问题,我相信在 public issue tracker 中已经提到,因此正在处理,可能具有高优先级。

至少,知道这不是您自己的错误导致的结果应该让您安心并继续开发,知道它会相对较快地修复,并且不代表安全风险,因为只有您可以访问您自己项目的 API 资源管理器。