Как сделать авторизацию и запросы токенов доступа с помощью PKCE

Можете ли вы указать мне правильный путь и набор параметров, чтобы:

  1. Сделайте запрос авторизации с помощью PKCE на мою конечную точку идентификации (https: //.../login) в Postman. В приложениях есть список параметров, которые отправляются. в качестве значения grant_type я использую - ›authorization_code К сожалению, я получаю неверный запрос Invalid_grant в Postman введите описание изображения здесь

  2. сделать запрос токена доступа. В этом запросе я получаю неверный запрос. Думаю, мне не хватает токена обновления параметра, но я не знаю, как его получить / сгенерировать: < img src = "https://i.stack.imgur.com/JxUuU.jpg" alt = "введите описание изображения здесь" />

Я написал код функции Azure для запроса токена доступа, к сожалению, я получаю {error: invalid_request} от конечной точки токена. Вот мой код, вы можете мне сказать, что я делаю не так?

[FunctionName("GetAccessToken")]
    public async Task<IActionResult> GetAccessToken(
  [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
  ILogger log)
    {
        try
        {
            log.LogInformation("C# HTTP trigger function ''GetAccessToken'' processed a request.");

            string clientSecret = "some secret";

            string accessToken = "";     

            RequestAccessToken rT = new RequestAccessToken();
            rT.Code = req.Form["code"];
            rT.RedirectUri = req.Form["redirect_uri"];
            rT.GrantType = req.Form["grant_type"];
            rT.ClientId = req.Form["client_id"];
            rT.CodeVerifier = req.Form["code_verifier"];

            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://<access_token_endpoint_base_uri>");
                client.DefaultRequestHeaders
                .Accept
                .Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));//ACCEPT header

                var body = new { EntityState = new {
                    code = rT.Code,
                    redirect_uri = rT.RedirectUri,
                    grant_type = rT.GrantType,
                    client_id = rT.ClientId,
                    client_secret = clientSecret,
                    code_verifier = rT.CodeVerifier

                } };
                var result = await client.PostAsJsonAsync(
                               "/login",
                               body);
                accessToken = await result.Content.ReadAsStringAsync();
            }             

            return new OkObjectResult(accessToken);

        }
        catch (Exception ex)
        {
            log.LogInformation(ex.ToString());

            return new ObjectResult(ex.ToString()) { StatusCode = 500 };
        }
    }

person OuterSpace    schedule 26.08.2020    source источник


Ответы (1)


Шаги 4 и 8 моего сообщения в блоге показывают стандартные параметры PKCE.

Однако сложно воспроизвести весь поток с помощью такого инструмента, как Postman, поскольку, как правило, также необходимо отслеживать перенаправления и управлять сообщением формы пользователя + пароль.

person Gary Archer    schedule 26.08.2020
comment
спасибо за ваш ответ. Я выполнил шаг 8, но получаю Invalid_client, моя проблема в том, что я не знаю, где взять значение кода - person OuterSpace; 26.08.2020
comment
Код авторизации можно получить, только отправив пользователь + пароль через систему входа в систему. Так что через почтальона это сделать сложно. Возможно, вы захотите рассмотреть альтернативный поток OAuth для автоматических тестов, например шаг 4 страницы моего блога о нагрузочном тестировании. Не могли бы вы добавить несколько примечаний к своему вопросу о конечной цели, которую вы пытаетесь достичь, и о том, какой сервер авторизации вы используете. - person Gary Archer; 26.08.2020
comment
Что касается моей конечной цели: мне нужно реализовать 2 API (с помощью функций Azure), которые выполняют авторизацию (первый API) и запрос токена доступа (второй API), реализующие шаблон PKCE. К сожалению, я не могу определить точный список параметров, которые нужно передать этим API, поэтому на данный момент я ищу в Google рекомендации и выполняю тесты с помощью Postman. - person OuterSpace; 27.08.2020
comment
Задача API в этой настройке - получать токены, затем проверять их и работать с идентификатором вызывающего абонента. Если API-интерфейсы вызывают друг друга, они должны использовать поток учетных данных клиента. PKCE всегда кодируется только в пользовательских интерфейсах. Я думаю, вы должны стремиться получить токен (через другой поток для PKCE), а затем сосредоточиться на вызове API и тестировании их поведения. Попытка выполнить вход PKCE из Postman - не лучшая идея. Более простой поток будет работать лучше. - person Gary Archer; 27.08.2020
comment
Я обновил свой вопрос кодом функции Azure, спасибо. - person OuterSpace; 31.08.2020