Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java REST API后端的OAuth2和电子邮件授权 概述_Java_Spring_Security_Oauth_Mobile Application - Fatal编程技术网

Java REST API后端的OAuth2和电子邮件授权 概述

Java REST API后端的OAuth2和电子邮件授权 概述,java,spring,security,oauth,mobile-application,Java,Spring,Security,Oauth,Mobile Application,我正在构建一个RESTful API应用程序作为mobile\web后端(我们称之为MyBackendApp),我正在寻找一个用于应用程序用户身份验证和授权的当代解决方案。后端的主要语言是Java。看看其他应用程序,它们中的许多都为用户提供了几种身份验证方法:使用外部应用程序帐户(如Facebook、Google、Yahoo、OpenId等)或内部(电子邮件\密码)。类似Stackoverflow的东西在它的注册\登录上有。我阅读了很多关于OAuth2的资料,我还使用SpringSecurity

我正在构建一个RESTful API应用程序作为mobile\web后端(我们称之为MyBackendApp),我正在寻找一个用于应用程序用户身份验证和授权的当代解决方案。后端的主要语言是Java。看看其他应用程序,它们中的许多都为用户提供了几种身份验证方法:使用外部应用程序帐户(如Facebook、Google、Yahoo、OpenId等)或内部(电子邮件\密码)。类似Stackoverflow的东西在它的注册\登录上有。我阅读了很多关于OAuth2的资料,我还使用SpringSecurity来实现内部用户帐户和会话管理。但我很难把这两种方法结合起来

要求
  • 我希望用户使用以下任一方法登录
    • 使用外部(可能是OAuth2)类似Facebook的帐户
    • 使用电子邮件\密码
  • 对API方法的基于角色的访问控制。MyBackendApp将具有以下角色:应用程序管理员、内容管理员、内容用户、内容创建者、开发人员(对于使用MyBackendApp API的其他应用程序)
  • 像所有现代移动应用一样,我希望用户在到期或会话撤销之前保持登录状态(如果按照当前实现思想中的描述进行,则可以使用令牌撤销)。我不希望他每次打开MyApp的移动应用程序都进入登录屏幕
  • 当前的实施思路 OAuth2 为了简单起见,我在这里使用Facebook这个术语,但假设它具有更一般的含义:任何外部提供商对MyBackendApp帐户进行外部身份验证。
    我的理解是,如果用户已经将Facebook的authToken(他已经使用Facebook应用程序登录)存储在他的移动设备中的某个位置,那么只需获取authToken(我相信我在Android SDK中看到了这个方法,如果我错了,请纠正我)。否则,需要通过标准OAuth过程从提供者(Facebook)接收authToken
    现在,从提供商MyBackendApp获得authToken和密钥可以从该令牌和:

    • 如果uniqueId已经在MyBackendApp数据库中,则用户已通过身份验证 和MyBackendApp允许或不允许访问请求的REST端点, 基于用户(由其唯一ID和电子邮件定义)角色
    • 如果uniqueId不在MyBackendApp数据库中,则用户正在通过MyBackendApp 注册过程,类似于Stackoverflow注册。他的信息存储在数据库中 用户被分配了一些角色
    电子邮件\密码验证 注册。若用户并没有注册,那个么他将经历注册过程:MyBackendApp将电子邮件和密码散列存储在DB中。它还分配了一个角色(比如说内容创建者)
    登录。如果用户已注册并希望登录

  • 他在客户端应用程序(WebUI JavaScript\Android\iOS)中输入电子邮件和密码
  • 客户端应用程序(我们称之为MyClientApp)从密码中获取哈希值(如果方法不正确,请纠正我),并通过https将其与电子邮件一起发布到MyBackendApp编辑:在客户端散列密码没有意义。而不是密码将通过SSL按原样发送。之后,服务器(MyBackendApp)将生成一个散列,并将其与数据库中存储的散列进行比较
  • 使用电子邮件和密码MyBackendApp对用户进行身份验证,并使用userUniqueId(UUID)颁发authToken(可能是JWT),该用户名是某个过期日期
  • authToken将在每次REST API请求时发送
  • 下次MyBackendApp接收到对某些REST端点的请求时,它将检索userUniqueId、expirationDate并基于角色allow\disallow调用
  • 总结
  • 上面“实施思路”一节中描述的方法有意义吗?有安全威胁吗
  • 一些帖子说OAuth不能用于用户身份验证,例如,但我不明白为什么?如果没有,那么如何使用facebook\google\others帐户为用户提供登录?
  • 我绝对不想重新发明自行车,所以我想知道有没有什么框架可以让这项任务变得更容易?我相信,支持OAuth2的Spring安全性对OAuth2的实现有很大帮助。但是这两种类型的登录(OAuth2+电子邮件\密码)是如何工作的呢
  • post建议[ApacheShiro]-它适合所描述的目的吗?它可以与Spring Security OAuth2结合使用吗
  • 我在上面写道,从提供商MyBackendApp获得authToken和密钥可以检索用户唯一的ID和电子邮件,但事实是否如此?提供者是否在authToken中包含此信息
  • 如果移动设备或web浏览器的用户已经获得authToken(例如,他登录facebook移动应用程序或桌面浏览器时存储了密码),并且他已经允许MyApp登录facebook一次,那么他是否可以在facebook帐户登录时打开我的应用程序,跳过登录过程?怎么做