我有一个使用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之间使用。如果您正在开发调用products
API的orders
API,则两者的受众可能是相同的。这使得JWT可以在api之间转发,这样双方都能收到一个可验证的用户身份。
然后,每个API应该验证JWT,并检查令牌是否具有来自JWT有效负载的API所需的作用域。如果不是这种情况,例如产品API没有接收到所需的作用域,它将返回一个403 forbidden响应。