微服务架构中如何将Auth服务与其他服务解耦?

阿德南穆塔勒布

我有一组微服务,其中一个负责身份验证。所有服务都使用一个共享库,例如flask_jwt_extended和一个共享密钥来验证传入的请求(例如使用flask_jwt_extended 的jwt_required装饰器)。

身份验证服务的主要端点是 UserLogin 和 UserLogout,类似这样:

class UserLogin(Resource):

    def __init__(self, *args, **kwargs):
        self.parser = reqparse.RequestParser()
        self.parser.add_argument('email', type=str, required=True)
        self.parser.add_argument('password', type=str, required=True)


    def post(self):
        args = self.parser.parse_args()
        email = args.get('email')
        password = args.get('password')

        user = User.query.filter_by(email=email).first()
        if not user:
            return jsonify({'message': 'User does not exist'})

        if user.verify_hash(password):
            access_token = create_access_token(identity=user.email) 
            return jsonify({'access_token': access_token})
        else:
            return jsonify({'message': 'Wrong credentials'})


class UserLogout(Resource):

    @jwt_required
    def post(self):
        #Get the token and presist 
        jti = get_raw_jwt()['jti']        
        blocked_token = BlockedTokens(jti=jti) 
        db.session.add(blocked_token)
        db.session.commit()
        return jsonify({'message': 'logged out'})

然后在其他服务中,我使用jwt_required装饰器保护端点,它只是验证传入请求的令牌(没什么特别的):

class PostDetails(Resource):

    @jwt_required
    def get(self, post_id):
        pass

当然,所有服务都共享相同的密钥:

app = app = Flask(__name__,)
app.config.from_mapping(JWT_SECRET_KEY=os.environ['JWT_SECRET_KEY']) 

理想情况下,注销操作应如下所示:

  1. 将访问令牌存储在身份验证服务的数据库中。
  2. 对于每个请求,如果其令牌在黑名单中,则阻止它。

我的问题是:

  1. 如何在不引入服务之间进一步耦合的情况下检查其他服务(身份验证服务除外)中被阻止的令牌?

  2. 是否可以通过不共享任何库或密钥来进一步分离服务?

编辑:我在问题中添加了更多细节和代码片段,我希望它得到更好的澄清和证明。

伊姆兰·阿尔沙德

基于以上评论。

简短的回答是肯定的,这可能是身份验证服务的开销,但这是解耦服务并将身份验证逻辑限制在同一服务中的最佳方式。

另一种方法是将令牌放入分布式缓存中,如果令牌被列入黑名单,则对其进行验证。您只能将令牌保留在令牌到期时间段内的缓存中。假设您的令牌过期时间为 15 分钟,您将只检查缓存中在过去 15 分钟内生成的令牌,其余令牌无论如何都已过期并且可以删除。这将使缓存的大小保持较小并更快地检查。此缓存服务可以在您的所有服务之间共享。

通常我们有网关服务(公共端点)验证令牌,并且该服务可以调用缓存服务来检查令牌是否在缓存黑名单中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章