我需要为使用JAX-RS标准实现的REST API提供授权和身份验证,这些API旨在从移动客户端和某些设备中使用。我有多个具有唯一设备标识的设备可以发布一些数据。移动客户端只是使用GET请求来显示该数据。我更关心POST部分,我想在哪里验证客户端。另外,我想保持简单。我正在考虑通过HTTPS使用简单的HTTP基本授权,使用API密钥。我的问题是如何生成此API密钥?
答案 0 :(得分:9)
你可以看看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
答案 1 :(得分:0)
答案 2 :(得分:0)
我也在研究这个问题,如果我想依赖JAX-RS标准并保持应用程序“纯粹”,我会使用容器附带的默认身份验证系统(通常是BASIC身份验证) )。
这意味着容器需要执行身份验证和课程级别授权,例如遵循标准的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拥有自己的身份验证系统,不支持客户端证书。
答案 3 :(得分:-2)
发现了一些很好的文章,这些文章清除了我对API密钥生成的疑问并将其用于身份验证:
http://restcookbook.com/Basics/loggingin/ http://www.smartjava.org/content/protect-rest-service-using-hmac-play-20