我正在开发一个带微服务的应用程序,我不知道如何分发微服务以允许auth.
我已经读过每个微服务应该有自己的数据库以避免耦合.
问题是身份验证(通过JWT)和用户微服务必须能够访问相同的数据库和表(用户).我想这个问题之前已经解决了,因为类似的应用程序必须处理同样的问题.
我怎么解决这个问题?
odi*_*ino 14
JWS(JWT的签名版本)是一个完美的例子,因为它被认为是类似的scnearios:
signin.domain.com),一旦你验证了用户的凭据,你发出了通过私钥生成的令牌service1.domain.com,service2.domain.com)都可以实现一个代替授权的中间件:所有服务都将接收公钥,并能够通过该密钥验证令牌的真实性.他们不需要DB,因为他们需要验证的是令牌是有效的,而不是用户存在等等.澄清我的上一个陈述:你应该发行非常短命的代币.那时,说:
service.domain.com在service.domain.com你仍然会考虑他登录,直到你需要与实际命中数据库的API进行交互(即添加新的用户地址).此时,负责写入数据库的服务将抛出异常,表示用户不存在,您可以捕获它并将用户注销.所有这一切都可以调整/微调,但你会大致了解它是如何工作的.
回到JWT及其用法,我不知道你是否熟悉PHP,但这是一个非常简单的例子.
如果你想获得幻想,你可以使用nginx作为中间件,并拥有类似auth模块为你授权的东西.
最后但并非最不重要的是,我们这里只介绍了身份验证:要进行授权,您可能要么在每个服务中要么从令牌中读取用户的角色(假设您在用户登录后将其保存在那里 - 但是这样有点瑕疵,好像用户失去一个角色,然后他的令牌仍然会列出它)或只是signin.domain.com/users/me从每个服务调用以检索最新的用户角色列表,然后检查他是否被允许对其执行某些操作具体服务.
哦,请记住,您不应该将敏感数据放在JWT/JWS中,因为它们可以被解码.所以,是的,您可以将用户角色添加到JWT,但是,例如,永远不要在那里保存密码或其他明文标记.
希望这可以帮助!