概述
我正在构建一个RESTful API应用程序作为mobile \ web后端(让我们称之为MyBackendApp),我正在为应用程序用户的身份验证和授权寻找现代解决方案。后端的主要语言是Java。查看其他应用程序,其中许多应用程序为用户提供了几种身份验证方法:使用外部应用程序帐户(例如Facebook,Google,Yahoo,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允许或不允许访问请求的REST端点,
基于用户(由其uniqueId和email定义)角色。
- 如果uniqueId不在MyBackendApp数据库中,则用户将通过MyBackendApp
注册过程,类似于Stackoverflow注册。他的信息存储在数据库中
用户被分配了一些角色
email \ password auth
登录后新即可。如果用户没有注册,那么他会经历注册过程:MyBackendApp在DB中存储电子邮件和密码哈希。它还分配了一个角色(比如内容创建者)
的登录即可。如果用户已注册并想要登录
- 他在客户端应用程序(WebUI JavaScript \ Android \ iOS)中输入电子邮件和密码
- 客户端应用程序(让我们称之为MyClientApp)从密码中获取哈希值(请纠正我,如果它不是正确的方式)并将其与电子邮件一起通过https发送到MyBackendApp。 编辑 :在客户端散列密码是没有意义的。而不是密码将通过SSL发送。之后,服务器(MyBackendApp)将生成一个哈希并将其与数据库中存储的哈希进行比较。
- 拥有电子邮件和密码MyBackendApp对用户进行身份验证并使用userUniqueId(UUID)发出authToken(可能是JWT),有些过期日期。
- 将在每个REST API请求上发送authToken
- 下次MyBackendApp收到某些REST端点的请求时,它会检索userUniqueId,expirationDate,并根据Role allow \ disallow调用。
醇>
摘要
- "实施思路中描述的方法&#34>以上部分有意义吗?任何安全威胁?
- 有些帖子称OAuth不能用于用户身份验证,例如here,但我没理由?如果没有,那么如何使用facebook \ google \ others帐户提供用户登录?
- 我绝对不想重新发明自行车,所以我想知道是否有任何框架可以让这项工作变得更轻松?我相信Spring Security及其OAuth2支持可以帮助实现OAuth2。但它如何适用于两种类型的登录(OAuth2 +电子邮件\密码)?
- This帖子建议[Apache Shiro] - 它对于描述的目的是否有用?可以与Spring Security OAuth2结合使用吗?
- 我在上面写道,拥有来自提供商MyBackendApp的authToken和密钥可以检索用户唯一ID和电子邮件 - 但情况如此吗?提供商是否在authToken中包含此信息?
- 如果移动设备或网络浏览器的用户已经获得了authToken(例如,他在Facebook移动应用程序中登录或桌面浏览器存储了他的密码)并且他已经允许在Facebook上使用MyApp - 他可以打开我的应用程序已经使用他的Facebook帐户登录跳过登录程序?怎么样?
醇>