В AWS API Gateway как обновить использование API Key? - PullRequest
0 голосов
/ 04 января 2019

Я разработал собственный лямбда-авторизатор с использованием .NET Core. Обработчик получает API-ключ от объекта Request и затем делает следующее:

1> Убедитесь, что API-ключ существует
2> Получить план использования по ID
3> Получить текущее использование для API-ключа
4> TODO: Теперь я хочу уменьшить оставшееся использование API-KEY на 1. Несколько вещей, которые я не могу понять
а) как я могу получить значение текущего использования от GetUsageResponse.Items
б) какие значения должны идти в PatchOperation для обновления использования?

public async Task<APIGatewayCustomAuthorizerResponse> FunctionHandler(APIGatewayCustomAuthorizerRequest authEvent, ILambdaContext context)
{
     var key = authEvent.QueryStringParameters["key"];
     var isAuthorized = CheckAuthorization(key);            
     var authPolicy = CreateAuthPolicy(isAuthorized);
     return authPolicy;
}

private async Task<bool> CheckAuthorization(string key)
{
    var client = new Amazon.APIGateway.AmazonAPIGatewayClient();            
    var response = await client.GetApiKeysAsync(new GetApiKeysRequest()
    {
        IncludeValues = true
    });   
    var apiKey = response.Items.SingleOrDefault(x => x.Value == key);
    if (apiKey == null)
    {
        return false;
    }

    // Get Usage Plan
    var usagePlan = await client.GetUsagePlanAsync(new GetUsagePlanRequest()
    {
        UsagePlanId = "myUsagePlanID"
    });               

    //Get API-KEY's Usage for current month
    var usage = await client.GetUsageAsync(new GetUsageRequest()
    {
        KeyId = apiKey.Id,
        UsagePlanId = "myUsagePlanID",
        StartDate = "2019-01-01",
        EndDate = "2019-01-31"
    });

    //TODO a)how do i get value of the current usage from `usage.Items`
    //TODO b) what values should go in PatchOperation to update Usage?
    var operations = new List<PatchOperation>();
    var operation = new PatchOperation()
    {
        From ="???",
        Op = "????",
        Path = "????",
        Value ="????"
    };
    operations.Add(operation);           

    await client.UpdateUsageAsync(new UpdateUsageRequest()
    {
        KeyId = apiKey.Id,
        UsagePlanId = "myUsagePlanID",
        PatchOperations = operations
    });           

    return true;
}
...