【问题标题】:REST API key generation strategyREST API 密钥生成策略
【发布时间】:2013-07-30 18:25:55
【问题描述】:

我需要为使用 JAX-RS 标准实现的 REST API 提供授权和身份验证,这些 API 旨在从移动客户端和某些设备中使用。我有多个具有唯一设备标识的设备,可以发布一些数据。移动客户端只是使用 GET 请求来显示该数据。我更关心 POST 部分,我想在其中对客户端进行身份验证。另外,我想保持简单。我正在考虑通过 HTTPS 使用简单的 HTTP 基本授权和 API 密钥。我的问题是如何生成此 API 密钥?

【问题讨论】:

    标签: api rest authentication jax-rs


    【解决方案1】:

    你可以看看 Shiro:http://shiro.apache.org 这是一个非常好的“保护”API(授权、身份验证和其他安全性)框架。您可以实施“基本身份验证”以“登录”您的用户(通过用户名/密码),然后为他们提供 API 密钥,您可以使用该密钥执行“不记名令牌身份验证”以允许他们访问资源你的 API。为此,您需要定义 shiro 所谓的“过滤器”,这些过滤器是在 API 资源上定义的……这在“shiro.ini”中定义如下:

    [main]
    authcBasicRealm = com.yourapp.shiro.UserAuthenticatorRealm
    tokenValidatorFilter = com.yourapp.shiro.BearerAuthenticationTokenFilter
    tokenValidatorRealm = com.yourapp.shiro.BearerAuthenticationTokenRealm
    
    [urls]
    /rest/hello/login/** = ssl[8443], noSessionCreation, authcBasic
    /rest/hello/hello = ssl[8443], noSessionCreation, tokenValidatorFilter
    

    您需要实现/扩展一些 Shiro 默认过滤器,以使它们与您的数据库一起使用以获取您的用户身份验证数据等。好处是它们提供了许多工具来处理安全问题,例如:生成 API密钥,加盐和加密等。看看他们的教程,它们总体上非常好。

    还有其他框架,Java EE 支持安全,Spring 也提供安全支持。看看 Mat Raible 的这个非常棒的演示文稿,他介绍并演示了这三个框架:http://www.slideshare.net/mraible/java-web-application-security-denver-jug-2013

    【讨论】:

    • 我不想使用其他安全框架。但是,无论如何,谢谢。
    • 我了解...但是如果您想管理 Web 服务中所有这些不同的安全方面(通过 HTTPS 进行基本授权,然后生成密钥并将其提供给用户,然后验证密钥等)。 ) 你可能会做我自己介绍的那种操作......我避免自己做,因为我不是安全专家,并且更喜欢依赖旨在处理这些事情的框架。如果您使用其中之一,Java EE、Spring 也有处理安全性的框架/库(我参考这些更新了我的答案)。
    【解决方案2】:

    您可以为此使用UUID。 UUID 如下所示:

    550e8400-e29b-41d4-a716-446655440000
    

    每种编程语言都有生成 UUID 的库。

    【讨论】:

    • 服务器如何知道客户端生成的 UUID,反之亦然?
    • 好的,现在我问,那我该如何分配密钥呢?
    • UUID 只有 128 位,根据生成方法的不同,它们的生成方式可能存在模式,漏洞利用可以利用这些模式。
    【解决方案3】:

    找到了一些很好的文章,消除了我对 API 密钥生成和使用它们进行身份验证的疑虑:

    http://restcookbook.com/Basics/loggingin/ http://www.smartjava.org/content/protect-rest-service-using-hmac-play-20

    【讨论】:

      【解决方案4】:

      我也在研究这个问题,如果我想依赖 JAX-RS 标准并保持应用程序“纯”,我会使用容器附带的默认身份验证系统(通常是 BASIC auth )。

      这意味着容器需要像 Java EE 应用程序一样执行认证和课程级别授权,这些应用程序遵循标准而不是构建变通方法(即使用 Shiro)。

      但是,如果您想使用 API 令牌等概念,同时让您的应用程序免于实现身份验证系统,则需要在其他地方(即容器)实现该工作。

      不幸的是,基于容器的身份验证必须是特定于容器的。 JAAS 没有描述标准容器 API 来执行身份验证领域。甚至他们的教程http://docs.oracle.com/javaee/6/tutorial/doc/bnbxj.html 也谈到了 Glassfish 的特定配置。

      如果您的组织足够大,DataPower 还支持 OAuth http://www.ibm.com/developerworks/websphere/library/techarticles/1208_rasmussen/1208_rasmussen.html,因此您可以使用它来管理身份验证并将正确的凭据传递给您的应用程序。然而。你仍然需要做一些特定于供应商的事情。

      虽然这不是一件坏事,但我宁愿采用这种方法,也不愿用自己的身份验证系统污染应用程序,从而在身份验证系统发生变化时使事情变得不灵活。例如SonarQube 有自己的身份验证系统,不支持客户端证书。

      【讨论】:

      • 我正在考虑的另一种方法,但不确定它是如何工作的(这就是我没有将其添加为答案的原因)是使用 bouncycastle 生成客户端证书供用户登录。
      猜你喜欢
      • 2011-02-08
      • 1970-01-01
      • 2019-08-24
      • 2013-08-31
      • 2020-03-22
      • 1970-01-01
      • 2012-04-29
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多