Oauth受众在登台环境和生产环境之间是否不同?



我有一个使用Oauth保护的API,我将在登台环境和生产环境中公开它。为了适当的安全性,API的受众是否应该在登台和生产之间有所不同?

如果两个环境之间的受众是相同的,这难道不允许使用单个访问令牌来访问生产和登台中的API吗?

谢谢。

对于部署管道的每个阶段,issuer声明应该是不同的。audience声明通常是一个表示组件的逻辑名称,并且可以在所有环境中相同。

发给客户端的令牌

访问令牌可以包含以下内置声明:

  • 发行人:https://login-staging.example.com
  • 观众:api.example.com
  • 范围:订单产品

ID令牌可能包含以下内容:

  • 发行人:https://login-staging.example.com
  • 观众:my-web-app

验证api中的jwt

典型代码如下所示,应该验证发行者和受众。这确保每个环境拒绝来自其他环境的令牌,并在发行者或受众检查失败时返回401响应。

const jwksEndpoint = 'https://login.example.com/.well-known/jwks';
const remoteJWKSet = createRemoteJWKSet(new URL(jwksEndpoint));
function validateJwtAccessToken(accessToken) {
const options = {
algorithms: ['RS256'],
issuer: 'https://login-staging.example.com',
audience: 'api.example.com',
};
const result = await jwtVerify(accessToken, remoteJWKSet, options);
const claims = result.payload;
return claims;
}

多个api

共享受众有时在来自同一所有者的多个api之间使用。如果您正在开发调用productsAPI的ordersAPI,则两者的受众可能是相同的。这使得JWT可以在api之间转发,这样双方都能收到一个可验证的用户身份。

然后,每个API应该验证JWT,并检查令牌是否具有来自JWT有效负载的API所需的作用域。如果不是这种情况,例如产品API没有接收到所需的作用域,它将返回一个403 forbidden响应。

最新更新