Scala 使用Akka-Http进行身份验证

Scala 使用Akka-Http进行身份验证,scala,authentication,oauth-2.0,amazon-cognito,akka-http,Scala,Authentication,Oauth 2.0,Amazon Cognito,Akka Http,我们正在开发一个iOS应用程序,用户需要使用电子邮件+密码(或手机号码)进行身份验证。我们的后端由几个使用Akka Http的微服务组成。它需要快速、可扩展、并发,并且身份验证+授权应该能够跨多个服务工作。 我正在试图找出使用哪种身份验证方法。 Akka HTTP目前提供基本身份验证和OAuth2的部分实现 所以一开始我们考虑基本身份验证(太简单,功能不够),Oauth1(太复杂),所以我们转向OAuth-2.0,因为它是一种标准 然后我们考虑AWS Cognito,因为它结合了Oauth-2.

我们正在开发一个iOS应用程序,用户需要使用电子邮件+密码(或手机号码)进行身份验证。我们的后端由几个使用Akka Http的微服务组成。它需要快速、可扩展、并发,并且身份验证+授权应该能够跨多个服务工作。 我正在试图找出使用哪种身份验证方法。 Akka HTTP目前提供基本身份验证和OAuth2的部分实现

所以一开始我们考虑基本身份验证(太简单,功能不够),Oauth1(太复杂),所以我们转向OAuth-2.0,因为它是一种标准

然后我们考虑AWS Cognito,因为它结合了Oauth-2.0和OpenID Connect,后者提供了OAuth2所缺乏的身份验证机制。

然后我们意识到OAuth2只是用于使用第三方的身份验证——而实际上我们不需要第三方身份验证提供商——也许我们需要自己来做,而使用Cognoto是一种过火的做法,它会在我们的微服务之外创建额外的api调用

因此,我读了一些关于使用WSSE规范创建我们自己的自定义身份验证提供程序的内容: 我还发现了这个使用Spray的示例,但我确信它与Akka Http没有什么不同: 它看起来太简单了,没有令牌过期

所以我的问题是,我是否遗漏了什么?我应该选择什么方法,在哪里可以找到它的例子


我觉得我好像在兜圈子,我们必须从头开始编写我们自己的自定义身份验证提供程序,这是没有意义的。毕竟,几乎每个人都需要身份验证,它应该是一个标准。

我最近一直在使用SoftwareMill的库,发现它简单且易于集成。它支持基于案例类的会话、JWT、使用可插拔存储的刷新令牌、使用头和CSRF令牌以及一些用于路由的简单指令。

坦率地说,我认为您过于复杂了,除非您没有提到具体要求。我通常将API放在HTTPS后面,允许移动客户端使用用户名/电子邮件和密码进行身份验证,并返回类似UUID的令牌。我将令牌存储在某种分布式缓存(memcached、ehcache、redis或类似的缓存)中。您的微服务在哪里运行?我认为在您的场景中根本不需要OpenID连接,因此一个简单的OAuth2服务会发出accessTokens(请参阅jwt.io),其中包括用户ID,角色和过期时间戳应该是您的服务独立验证/授权请求所需的一切。在我看来,唯一有点棘手的是刷新令牌处理。这就是我们最终所做的,我们实现了自己的简单刷新令牌行为