【问题标题】:oAuth user authentication in internal rest APIoAuth 内部 rest API 中的用户身份验证
【发布时间】:2014-04-18 01:12:51
【问题描述】:

我正在构建一个 REST API 服务,该服务不公开,仅由客户端用于访问服务器上的资源。没有不同消费者的授权,因为唯一的消费者是服务器。

我了解 3 腿 oAuth 是 Facebook 等公共 API 使用的标准,我认为我假设我经过 2 腿身份验证是正确的,但我找不到描述它的有用网站。

我需要使用 oAuth 来访问资源和/或更改它们。显然,这应该受到保护。但我不确定如何在 PHP 中执行此操作。因此,如果用户通过发布请求请求 https://example.com/me/follow/123 之类的内容,则只有在用户登录时才会关注用户 123。

我还希望公共资源只能由认可的客户访问。因此,如果您访问 https://example.com/user/123,则会给出 401,但如果您访问 https://example.com/user/123?client_id=890,则会给出结果。这不会阻止未登录的用户获取公共资源,但会阻止未使用公认客户端的用户。最重要的是,这是我跟踪未来哪些客户正在使用 API 的一种方式。

1) 您如何进行登录并为用户提供随每个 API 请求发送的令牌?

2) 如何保护 API 不被无法识别的客户端使用?

如果我的任何术语或想法不正确,我深表歉意。我对 REST 和 oAuth 的理解仍在不断发展。

【问题讨论】:

    标签: php api rest oauth


    【解决方案1】:

    您必须使用 grant types=client credentials 在 OAuth 标准点 4.4 https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-31#section-4.4 中检查它

    【讨论】:

      【解决方案2】:

      我同意 cleint_credentials grand 是最安全和最标准的应用级别身份验证方式 - 您的客户端向特定资源发送访问令牌请求,并在 Basic Auth 标头中包含其 client_id 和 client_secret,如下所示:

      Authorization: Basic {base64 encode client_id:client_secret}
      

      然后所有后续请求都使用访问令牌作为承载令牌,就像这样

      Authorization: Bearer {access_token}
      

      但是...如果这是一个纯粹的内部 API,并且您不需要超级安全性,那么在每次调用时简单地验证 client_id(或 apikey)也是可以接受的。这意味着您的 API 需要查找(或缓存)apikey 的有效性。

      为了安全起见,我建议您将 apikey 作为标头发送,这样它就不会暴露在查询参数中,但也可以将 apikey 作为查询参数发送,例如

      /myresource?apikey={client_id}
      

      从安全角度不推荐,但在 API 世界中接受的做法。

      【讨论】:

        猜你喜欢
        • 2016-09-07
        • 2014-05-02
        • 2018-05-02
        • 2014-10-12
        • 2017-10-12
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        相关资源
        最近更新 更多