使用spring security和mongodb的Rest身份验证

使用spring security和mongodb的Rest身份验证,spring,mongodb,spring-security,spring-security-oauth2,spring-security-rest,Spring,Mongodb,Spring Security,Spring Security Oauth2,Spring Security Rest,我已经用mongodb实现了一个Spring应用程序,现在我已经实现了,现在我必须添加Authorization头,如果Authorization正常,它只显示来自api调用的数据,从现在开始就可以了,但我想知道如何获得这个值?我的意思是,我想登录应用程序,我应该对此进行授权吗?如果没有,登录响应应该返回此授权,以便在下次调用中使用它? 我也读过aws token以及oauth2,但我真的很想知道这个过程,我的意思是,普通用户可以登录到应用程序,然后通过授权拨打电话的流程是什么 我的平台是: D

我已经用
mongodb
实现了一个
Spring
应用程序,现在我已经实现了,现在我必须添加
Authorization
头,如果
Authorization
正常,它只显示来自api调用的数据,从现在开始就可以了,但我想知道如何获得这个值?我的意思是,我想登录应用程序,我应该对此进行授权吗?如果没有,登录响应应该返回此授权,以便在下次调用中使用它? 我也读过
aws token
以及
oauth2
,但我真的很想知道这个过程,我的意思是,普通用户可以登录到应用程序,然后通过授权拨打电话的流程是什么

我的平台是:

DB—MongoDB

服务器——Spring

网角

应用程序——Android

这是一个测验游戏项目,可以支持多游戏选项(一次玩多个玩家)


所以我需要了解的是,从APP/WEB我必须进行一个调用,比如说api/v1/login,然后发送用户和密码,好的,当我必须创建bcrypted和salt文件以将其存储到数据库中时,那部分在哪里?我是否必须在应用程序上执行此操作,然后在登录调用中通过JSON发送SHA,或者最好将密码发送到服务器,以便服务器执行所有操作并将这些操作存储在db上?

我强烈建议您使用Spring Security、OAuth2和JWT令牌来保护REST API。 流程如下所示:

  • 用户可以登录应用程序
  • 生成一个令牌
  • 此令牌设置在每个请求的标头中
通常令牌有一个持续时间 OAuth2基本上定义了两个实体:

  • 授权服务器:它是负责授权过程的实体。它检查提供的凭据,如果一切正常,它将生成令牌
  • 资源服务器:将公开RESTAPI的实体。这 实体将检查每个请求中是否存在令牌以及 令牌是有效的
教育部信息可在此处查阅

更新

在这里,我上传了一个简单的示例og Spring(而不是Spring引导)OAuth JWT基于DB H2的身份验证

您可以下载它并将其改编为mongodb。我认为它足够简单,可以适应它。可悲的是,这对我来说是一个非常紧张的工作时期,我无法做到这一点

我希望它有用


Angelo

在您描述的场景中,使用OpenID Connect或OAuth2都没有意义。对于身份验证和资源,只有一台服务器。情况大致如下:

  • 客户端(Angular或App)通过安全HTTP连接以明文形式将凭据发送到服务器以登录
  • 服务器使用访问和刷新令牌进行响应
  • 两个令牌都需要保存在客户端设备上(例如本地存储)
  • 将访问令牌与每个需要身份验证的请求一起发送
  • 在访问令牌到期之前,您会触发某个REST调用,以使用刷新令牌刷新令牌
  • 服务器发回一个新的访问和一个新的刷新令牌。存储它们并删除旧的
  • 使用SpringBoot,您几乎可以免费获得所有功能。除非你没有一个具体的例子,否则我不会给出代码片段。你会在网上找到精彩而简洁的例子

    查找有关如何随请求一起发送访问令牌的教程


    关于数据库问题,一个简单但有效的方案是(在数据库中)将加密的密码存储在用户旁边。如果用户登录,他将向您发送您需要加密的纯文本密码,并将其与您存储的密码进行比较。永远不要存储纯文本密码,只是在登录过程中使用它。您可能希望在java应用程序中使用密码。p> Oauth是授权委托协议,而不是身份验证协议。Oauth2和JWT认证层被称为开放Id连接(OIDC),因此,我必须将它们存储在应用程序的缓存和web的缓存中?我是说访问令牌和刷新令牌?如何从双方获取它们?谁可以生成访问令牌和刷新令牌是授权服务器。一旦你得到它们,你就必须储存它们。如何存储它们取决于您的业务逻辑。例如,如果访问令牌从未过期,那么您应该以某种方式将其持久化。否则,您可以拥有一个持续时间等于令牌持续时间的缓存。您可以提供一个示例吗?你从春天买的?所以我必须发送它们作为登录的答案?我不需要关于Web或Android的示例,我需要关于如何通过服务器提供它们以及在其中存储什么的示例抱歉,我一直很忙。明天我会提供一个完整的工作示例是的,这是我需要的,但是Matt你能详细说明我应该在DB上做什么吗?那么,我应该保存Bcrypted密码吗?检查user==user and password==password,而不是user==user and passwordencrypted==passwordencrypted,这是一个好主意。我在帖子中添加了一个关于登录过程的部分。谢谢Matt,回答得很好,我想最后一个问题是,apps/web如何知道令牌已过期?例如,当我执行api调用时,它返回403,然后我必须执行额外的调用?说到令牌,您通常(但不一定)指的是JWT,它是一个JSON结构,可以包含多个属性,其中包括令牌发出的时间和到期的时间。通过这些信息,您知道何时刷新令牌。不需要让后端检查令牌的有效性。看见