Vic*_*c K
5
java
security
spring
oauth
mobile-application
概观
我建立一个RESTful API的应用程序,移动\ Web后端(姑且称之为MyBackendApp)和我正在寻找一个应用程序的用户的身份验证和授权当代的解决方案.后端的主要语言是Java.综观其他应用程序,其中许多人提供了多种身份验证方法的用户:使用外部到App帐户(如Facebook,谷歌,雅虎,的OpenID等)或内部(电子邮件\密码).像Stackoverflow这样的东西在注册\登录.我阅读了很多关于OAuth2的消息来源,我也习惯使用Spring Security来实现内部用户帐户和会话管理.但我很难把两种方法放在一起.
要求
- 我希望用户使用以下任一方法登录
- 与外部(可能是OAuth2)类似Facebook的帐户
- 使用电子邮件\密码
- 基于角色的访问控制API方法.MyBackendApp将具有以下角色:app admin,内容管理员,内容用户,内容创建者,开发者(对于使用MyBackendApp API的其他应用)
- 像所有的现代移动应用我想呆的用户登录,直至过期或撤销会话(如果为在当前实现的想法如下所述去的话,就可以撤销凭证来完成).每次打开MyApp的移动应用程序时,我都不希望他登录屏幕
当前的实施思路
的OAuth2
为简单起见,我在这里使用Facebook术语,但假设更一般的含义:来自任何外部提供商的MyBackendApp账户外部认证.
我的理解是,如果用户已经拥有来自Facebook的authToken(他已经使用他的Facebook应用程序登录)存储在他的移动设备中的某个位置,那么只需获取authToken(我相信我在Android SDK中看到了方法,如果我',请纠正我我错了).否则,需要通过标准OAuth过程从提供商(Facebook)接收authToken.
现在,拥有来自提供者MyBackendApp的authToken和密钥可以从令牌中检索用户唯一ID和电子邮件,并且:
- 如果uniqueId已经在MyBackendApp数据库中,那么用户将被认证,并且MyBackendApp允许或不允许基于用户(由其uniqueId和email定义)角色访问所请求的REST端点.
- 如果uniqueId不在MyBackendApp数据库中,那么用户正在进行MyBackendApp注册过程,这类似于Stackoverflow注册.他的信息存储在DB用户被分配了一些角色
email\password auth
注册.如果用户没有注册,那么他会经历注册过程:MyBackendApp在DB中存储电子邮件和密码哈希.它还分配一个角色(比如说内容创建者)
登录.如果用户已注册并想要登录
- 他在客户端应用程序中输入电子邮件和密码(WebUI JavaScript\Android\iOS)
- 客户端应用程序(让我们称之为MyClientApp)从密码中获取哈希(如果不是正确的方法,请更正我)并将其与电子邮件一起通过https发送到MyBackendApp.编辑:在客户端散列密码是没有意义的.而不是密码将通过SSL发送.之后,服务器(MyBackendApp)将生成一个哈希并将其与DB中的存储哈希进行比较.
- 有电子邮件和密码MyBackendApp验证用户身份并使用userUniqueId(UUID)发出authToken(可能是JWT),有些过期日期.
- 将在每个REST API请求上发送authToken
- 下次MyBackendApp收到某些REST端点的请求时,它会检索userUniqueId,expirationDate并基于Role allow\disallow调用.
摘要
- 上面"实施思路"部分中描述的方法是否有意义?任何安全威胁?
- 有些帖子说OAuth不能用于用户身份验证,例如这里,但我不明白为什么?如果没有,那么如何使用facebook\google\others帐户提供用户登录?
- 我绝对不想重新发明自行车,所以我想知道是否有任何框架可以让这项任务变得更容易?我相信Spring Security及其OAuth2支持可以帮助实现OAuth2.但它如何适用于两种类型的登录(OAuth2 +电子邮件\密码)?
- 这篇文章建议[Apache Shiro] - 这对于描述的目的是否有用?它可以与Spring Security OAuth2结合使用吗?
- 我在上面写道,拥有来自提供商MyBackendApp的authToken和密钥可以检索用户唯一ID和电子邮件 - 但情况如此吗?提供者是否在authToken中包含此信息?
- 如果移动设备或网络浏览器的用户已经获得了authToken(例如,他登录了facebook移动应用程序或桌面浏览器存储了他的密码)并且他已经允许在Facebook上使用MyApp - 他可以打开我的应用程序已经登录了他的脸书帐户跳过登录程序?怎么样?