Java RESTAPI授权类型
我已经读了很多关于提供RESTAPI访问的方法的书,但我仍然不能决定使用什么 在我的例子中,我正在编写一个restapi,它将被移动应用程序(android和iOS)的用户使用,因此我不提供或要求第三方访问,这使我认为我不必使用OAuth。 但是,我考虑了如何从多个设备访问一个用户的帐户,以及如何提供脱机访问Java RESTAPI授权类型,java,api,rest,jersey,Java,Api,Rest,Jersey,我已经读了很多关于提供RESTAPI访问的方法的书,但我仍然不能决定使用什么 在我的例子中,我正在编写一个restapi,它将被移动应用程序(android和iOS)的用户使用,因此我不提供或要求第三方访问,这使我认为我不必使用OAuth。 但是,我考虑了如何从多个设备访问一个用户的帐户,以及如何提供脱机访问 我需要考虑的另一个问题是如何限制API访问,例如,如果使用API令牌,令牌过期和续订的最佳做法是什么?有两件事需要保护/验证 客户端应用程序被授权使用该服务 用户有权访问个人数据 应用
我需要考虑的另一个问题是如何限制API访问,例如,如果使用API令牌,令牌过期和续订的最佳做法是什么?有两件事需要保护/验证
- 客户端应用程序被授权使用该服务
- 用户有权访问个人数据
http://service.com/rest?client_id=android
Reply method(String client_id) {
if (!client_id in ["andoid", "ios"])
return Unauthorized();
}
您可以将该模式更改为更难猜测的模式,但您所做的任何事情都可以归结为相同的安全级别
用户身份验证
保护用户数据至关重要,幸运的是这是可能的。关键的区别在于,这个秘密不是静态地硬编码到应用程序中的,它只为用户所知
验证用户身份的一个“简单”方法是使用他们拥有的其他帐户。类似的模式允许您完全做到这一点
基本上,您可以将身份验证委托给其他服务。并获取(每个服务)唯一的用户id,您可以在代码中使用该id作为所有用户数据的密钥。攻击者无法伪造此令牌,因为您的服务器可以通过请求其他服务来验证令牌是否有效。大致上像
http://service.com/rest?client_id=android&user_token=aasjkbn9nah9z23&user_auth_service=facebook
Reply method(String client_id, user_token, user_auth_service) {
if (!client_id in ["andoid", "ios"])
return Unauthorized();
authenticated_user_id = user_auth_service.getUserIdOrFail(user_token);
accessDatabase(authenticated_user_id);
}
攻击者仍然可以从某些邪恶的应用程序使用您的服务,但无法访问他无论如何都无法访问的帐户
如果你将访问令牌硬编码到应用程序中,你最好不要让它们过期,或者确保以某种方式在应用程序中专门处理这种情况。总是有用户使用过时的应用程序版本。您的问题中有几个主题:
- OAuth2对于Internet上公开的内部API有什么好处
- 我应该如何管理代币
- 用户如何通过多个设备获得访问权限
- 用户如何进行脱机访问
- 根据编辑的类型或用户的角色,一个编辑会覆盖另一个编辑
- 忽略最后一次编辑,或提供最后一次编辑的分辨率
- 某些类型的编辑可能会自动“合并”
- 等等
另一个好的简单策略是禁止脱机时进行所有编辑。一个很好的答案!这澄清了我一直想知道的所有事情,并整理了我的想法。就我开始用令牌实现RESTAPI而言,这对我来说非常合适,只需做一些调整。