Я пытаюсь реализовать пользовательскую авторизацию на 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" : "*"
}
Однако, несмотря на то, что авторизатор эффектов, возвращенный в документе политики, API-шлюз все равно пропускает все запросы.Я получаю статус 200, а также набор результатов из конечной точки API внизу.
Любые идеи о том, почему API-шлюз будет игнорировать политику?
PS Я пытался с явным принципалом PrincipalID (имя пользователя / тема из токена) перед тем, как поставить там звездочку.Он вел себя так же.
PPS Вот полностью недействительная версия моей лямбда-функции, в настоящее время настроенная на всегда возвращать Deny в качестве эффекта политики ...
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; }
}