![](/img/trans.png)
[英]Custom request-based lambda authorizer for AWS API Gateway is not triggered for API innovations
[英]AWS API Gateway ignores auth policy returned from the Custom Authorizer Lambda Function
我正在尝试在 API 网关上实现自定义授权,这将通过从 DynamoDB 读取它们来检查用户对其背后的每个特定端点的权限。
授权方似乎工作正常,它返回对我来说看起来不错的策略(看看下面)
{
"policyDocument" : {
"Version" : "2012-10-17",
"Statement" : [
{
"Action" : "execute-api:Invoke",
"Effect" : "Deny",
"Resource" : "arn:aws:execute-api:us-east-2:111111111111:mkvhd2q179/*/GET/api/Test"
}
]
},
"principalId" : "*"
}
但是,无论策略文档中返回的 Effect 授权方如何,API 网关仍然让所有请求通过。 我从下面的 API 端点获得状态 200 和结果集。
关于为什么 API 网关会忽略该策略的任何想法?
PS 在放星号之前,我尝试使用明确的 principalID(令牌中的用户名/主题)。 它的行为相同。
PPS 这是我的 Lambda 函数的完全简化版本,目前设置为始终返回拒绝作为策略效果......
public class Function
{
public AuthPolicy FunctionHandler(TokenAuthorizerContext request, ILambdaContext context)
{
var token = request.AuthorizationToken;
var stream = token;
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(stream);
var tokenS = handler.ReadToken(token) as JwtSecurityToken;
return generatePolicy(tokenS.Subject, "Deny", "arn:aws:execute-api:us-east-2:111111111111:mkvhd2q179/*");
}
private AuthPolicy generatePolicy(string principalId, string effect, string resource)
{
AuthPolicy authResponse = new AuthPolicy();
authResponse.policyDocument = new PolicyDocument();
authResponse.policyDocument.Version = "2012-10-17";// default version
authResponse.policyDocument.Statement = new Statement[1];
authResponse.principalId = "*";
Statement statementOne = new Statement();
statementOne.Action = "execute-api:Invoke"; // default action
statementOne.Effect = effect;
statementOne.Resource = resource;
authResponse.policyDocument.Statement[0] = statementOne;
return authResponse;
}
}
public class TokenAuthorizerContext
{
public string Type { get; set; }
public string AuthorizationToken { get; set; }
public string MethodArn { get; set; }
}
public class AuthPolicy
{
public PolicyDocument policyDocument { get; set; }
public string principalId { get; set; }
}
public class PolicyDocument
{
public string Version { get; set; }
public Statement[] Statement { get; set; }
}
public class Statement
{
public string Action { get; set; }
public string Effect { get; set; }
public string Resource { get; set; }
}
长话短说;博士; 删除/更改/检查网关中设置的“资源策略”。
我有一个类似的问题。 不知何故,我在网关的资源策略中设置了“允许 * 主体访问 * 资源”策略,该策略与授权方返回的任何内容相结合。 我最终删除了所有资源策略并让授权者决定。
我也有这个问题。 事实证明,从 API 网关控制台屏幕(例如https://us-west-2.console.aws.amazon.com/apigateway/ )发出请求并没有适当地调用授权方。
我猜是因为您的控制台会话有自己的 IAM 策略,这会干扰授权方策略。
解决方案是在 API 网关控制台之外手动卷曲端点。
此外,不要忘记在进行更改后部署 API:否则您的更改将不会生效:
我有一个类似的问题。 我们的 API 网关资源策略的设置方式允许我们在账户级别执行任何 API ( arn:aws:execute-api:us-east-1:xxxxx:*
)。
即使实现了细粒度访问,我们返回一个策略以仅允许特定的 arn API 网关资源策略优先。 因此,我删除了资源策略并重新部署了 API,它允许该特定 API 并拒绝其他 API。 或者你可以根据你如何配置 Effect 和 policy 语句来尝试反之亦然。
初始资源策略:(我删除并重新部署)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-east-1:xxxxx:*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"xx.xx.xx.xxx/24"
]
}
}
}
]
}
返回的最终 Lambda 身份验证策略:
{
"principalId": "xxxxxxxxxx",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"execute-api:Invoke"
],
"Resource": [
"arn:aws:execute-api:us-east-1:xxxxx:bxxxx/*/POST/*/someresource"
]
}
]
}
}
AWS 文档令人困惑……看来您仍然需要使用“回调”来解决问题,并且不足以返回“拒绝”策略……
exports.authorizer = (event, context, callback) => {
if (invalidToken) {
callback("Unauthorized", null);
}
// create a valid policy
return validPolicy
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.