API Gateway - пользовательский авторизатор не работал - PullRequest
0 голосов
/ 05 февраля 2019

У меня возникли проблемы с настройкой / использованием аутентификации на AWS ApiGateway.У меня уже есть лямбда-функция, настроенная с помощью кода, который получает модель аутентификации AWS, см. Ниже, которая в основном декодирует токен JWT и проверяет, может ли данный пользователь получить доступ к ресурсу:

{
"type": "TOKEN",
"authorizationToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjotMTU1LCJwcm9kdWN0IjoiQmlsbGlvblJ1biIsInBlcm1pc3Npb25fbGV2ZWwiOjEsInNhbHQiOiJzZWNyZXRfcGhyYXNlIn0.3gZUFITe8or2mPWBAZlOxdcGF6-ybykHVsMRsqoUI_8",
"methodArn": "arn:aws:execute-api:us-east-1:123456789012:example/prod/POST/{proxy+}"

}

См. Ниже пример выходных данных из документации ApiGateway.Первый - когда пользователь успешно подтвержден (разрешение предоставлено), а второй - когда пользователь не может подтвердить (разрешение отклонено):

{
"principalId": "users",
"policyDocument": {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "execute-api:Invoke",
            "Effect": "Allow",
            "Resource": "arn:aws:execute-api:REGION:AWS_ACCOUNT:example/prod/POST/{proxy+}"
        }
    ]
},
"context": {
    "user_id": XXX,
}

}

Разрешение отклонено:

{
"principalId": "users",
"policyDocument": {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "execute-api:Invoke",
            "Effect": "Deny",
            "Resource": "arn:aws:execute-api:REGION:AWS_ACCOUNT:example/prod/POST/{proxy+}"
        }
    ]
}

}

Проблема заключается в следующем: каждый раз, когда я тестирую пользовательскую функцию авторизации, возвращаемое состояние равно 200 (вместо 401), и разрешение предоставляется (даже когда я отправляю неправильные токены).

Кроме того, я действительно чувствую, что он даже ничего не тестирует, хотя на экране видно, что функция пользовательской аутентификации включена.

Ресурс, показывающий пользовательский авторизатор

Внутренний ресурс

Пользовательский Авторизатор

Недопустимый токен

ДействительныйТокен

------- РЕДАКТИРОВАТЬ -------

Вот код, как я реализовал вывод:

def generate_policy(principal_id, effect, resource, context=None):
doc = {
    'principalId': principal_id,
    'policyDocument': {
        'Version': '2012-10-17',
        'Statement': [{
            'Action': 'execute-api:Invoke',
            'Effect': effect,
            'Resource': resource
        }]
    }
}
if context:
    doc["context"] = context
return doc

ИтакВы можете позвонить так, чтобы «разрешить»:

generate_policy("users", "Allow", method_arn, auth_info)

Или как это «отрицать»:

generate_policy("users", "Deny", method_arn)

-------- ИЗМЕНИТЬ СНОВА ------ Укажите весь мой код:

https://gist.github.com/hermogenes-db18/1ccf3eb8273f266a3fa02643dcfd39bd

1 Ответ

0 голосов
/ 08 февраля 2019

.Net Core (C #) версия Custom Authorizer

    public class Function
      {
      public AuthPolicy FunctionHandler(TokenAuthorizerContext request, 
       ILambdaContext context)
        {
            var token = request.AuthorizationToken;
            var resourcePath = Environment.GetEnvironmentVariable("resourcePath");
            if (string.IsNullOrEmpty(token))
            {
                return generatePolicy("user", "Deny", request.MethodArn);
            }
            AuthPolicy policy;
                var client = new HttpClient();
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Add("Authorization", token);
                var dsresponse = 
            client.GetAsync(Environment.GetEnvironmentVariable("validationURL")).Result;
                if (dsresponse.IsSuccessStatusCode)
                {
                    policy = generatePolicy("user", "Allow", resourcePath);
                }
                else
                {
                    policy = generatePolicy("user", "Deny", resourcePath);
                }
            return policy;
        }

        private AuthPolicy generatePolicy(string principalId, string effect, string 
        resourcePath)
        {
            AuthPolicy authResponse = new AuthPolicy();
            authResponse.policyDocument = new PolicyDocument();
            authResponse.policyDocument.Version = "2012-10-17";// default version
            authResponse.policyDocument.Statement = new Statement[1];

            Statement statement = new Statement();
            statement.Action = "execute-api:Invoke"; // default action
            statement.Effect = effect;
            statement.Resource = resourcePath;
            authResponse.policyDocument.Statement[0] = statement;
            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; }
    }

Ответ:

Запрос отклонен:


       {
        "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Action": "execute-api:Invoke",
            "Effect": "Deny",
            "Resource": "arn:aws:execute-api:us-east-2:AccountId:API_Id/*"
          }
        ]
       },
       "principalId": null
     }

Запрос разрешен:

</p>

<pre><code>   {
    "policyDocument": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow",
        "Resource": "arn:aws:execute-api:us-east-2:AccountId:API_Id/*"
      }
    ]
   },
   "principalId": null
  }
</code>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...