微服务认证授权的误区

问题描述 投票:0回答:1

我有三个 graphql 微服务

  • 网关(@mercurius/gateway)
  • 用户服务
  • 旅游服务。

我的实施想法。

当客户端(react-native应用程序)发送注册用户的请求时,api网关允许 它无需身份验证即可访问用户服务。一旦进入用户服务,用户 创建并发出令牌并将其发送回客户端。 (这个阶段对我来说还可以)。

第二阶段是客户端向travel-service发送需要认证的请求。 请求到达 api 网关,API 网关应该在之前验证令牌 将请求定向到相应的服务。

我的问题

如果api网关必须验证令牌,则意味着它将使用相同的令牌 在用户服务(jsonwebtoken)中颁发令牌的库,它将检查用户是否 发送请求属于位于用户服务处的用户数据库。

如果api网关使用用户服务数据库,则关注点分离 的微服务功能已被破坏,因为 api 网关将使用与 user-service 用于颁发令牌,每次都会访问 user-service 数据库 一个请求到达。 (这是我的想法)

这是实现这一点的最佳实践吗?或者还有其他最好的方法。

authentication jwt gateway
1个回答
0
投票

JSON Web 令牌 (JWT) 有几个关键部分。重要的是,它通常是经过加密签名的,因此您通常可以信任其内容。它的主要内容是一组claims,其中包括issuer

iss
),用于第二次检查是谁发行的,expiration时间(
exp
)和subject
sub
) 令牌 – 对于谁有效。

我在这里看到的一种典型方法是仅系统的一部分发出签名令牌;也许这是你的用户服务。这会生成一个签名令牌,具有相对较短的过期时间、已知的发行者值以及对特定用户身份进行编码的主题。

网关依次需要验证签名、检查过期时间并检查颁发者字符串是否匹配。这里的技巧是,这些都是非常典型的 JWT 操作。您引用了 jsonwebtoken Node 库;这些本质上是

jwt.verify()
的选项。检索公钥的典型方法是使用 JSON Web 密钥集 (JWKS) 格式,并且 jsonwebtoken 包含一个使用 jwks-rsa 检索该公钥的简短示例。完全复制他们的例子:

// Verify using getKey callback
// Example uses https://github.com/auth0/node-jwks-rsa as a way to fetch the keys.
var jwksClient = require('jwks-rsa');
var client = jwksClient({
  jwksUri: 'https://sandrino.auth0.com/.well-known/jwks.json'
});
function getKey(header, callback){
  client.getSigningKey(header.kid, function(err, key) {
    var signingKey = key.publicKey || key.rsaPublicKey;
    callback(null, signingKey);
  });
}

jwt.verify(token, getKey, options, function(err, decoded) {
  console.log(decoded.foo) // bar
});

网关不需要需要单独验证

sub
声明。它知道用户服务最近生成了令牌(具有有效签名),因此用户 ID 可能是有效的,除非用户在上次登录和令牌过期之间已被停用。

© www.soinside.com 2019 - 2024. All rights reserved.