【问题标题】:Cloud Endpoints won't require authenticationCloud Endpoints 不需要身份验证
【发布时间】:2015-02-19 23:03:09
【问题描述】:

我已经使用 Google App Engine 构建了一个与 Web 客户端通信的自定义端点 API,并且我已经成功地使用 API Explorer 和 Web 客户端对其进行了测试。

现在我正在尝试通过这些instructions 使用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 Cloud Endpoints API 要求每次调用都进行身份验证?

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

【问题讨论】:

    标签: python google-app-engine google-oauth google-cloud-endpoints


    【解决方案1】:

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

    • 客户端 ID 层,它管理从哪里可以调用 API 的哪些代码,以及哪些客户端 ID/秘密。你可以阅读这个here

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

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

    至少,知道这不是您自己的错误造成的,应该让您放心并继续开发,知道它会很快得到修复,并且不会对安全构成风险,因为只有您可以访问自己项目的 API Explorer。

    【讨论】:

    • 那么 Web 客户端的端点授权仍然需要用户层身份验证吗?如果我只想确保只有 Web 应用程序客户端连接到端点,但又不想打扰单个用户登录或授权怎么办?
    • 没关系,我能弄明白。我需要使用endpoints.get_current_user() != None (python) 来验证每个调用是否确实存在授权当前调用的用户。似乎没有一种方法可以仅使用应用程序授权端点调用,而无需使用用户的 OAuth。如果有一种方法可以用端点说“只允许来自此应用程序的调用”,那就太好了,但这目前有效。谢谢!
    • 嘿,我很高兴您知道如何在我不回来的情况下进行用户身份验证,因为我之前已经阅读了您的评论,但无法坐下来写。就您最近的评论而言,说现在有办法进行调用上下文身份验证是不正确的——这正是客户端 ID/秘密的用途。用户身份验证用于检查您是否要检查登录用户帐户的 OAuth2 是否授权您的应用具有 userinfo.email 范围,并且是否具有与请求一起发送的有效 Bearer 令牌。
    【解决方案2】:

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

    每次调用你必须做的是检查用户对象并确定是否:

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

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

    在说明中,这具体为第 3 点:“为您希望保护的每个方法添加当前用户检查 (endpoints.get_current_user)。”

    【讨论】:

    • 对于所提出的问题,这不是正确答案,但您所说的关于用户身份验证的内容是正确的。 Endpoints 有两层身份验证。有 Client ID auth 层,还有 User auth 层。 OP 询问为什么 API Explorer 客户端 ID 不在允许的客户端 ID 列表中时 API Explorer 仍然可以发出请求。
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 2016-02-03
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多