0

您能否指出正确的方法和参数集:

  1. 在 Postman 中使用 PKCE 向我的身份端点 (https://.../login) 发出授权请求 在附件中有发送的参数列表。作为我使用的 grant_type 值-> authorization_code 不幸的是,我收到“错误请求”,邮递员中的 Invalid_grant 在此处输入图像描述

  2. 发出访问令牌请求。在此请求中,我收到无效请求。我想我错过了参数刷新令牌,但我不知道如何获取/生成它: 在此处输入图像描述

我编写了 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 };
        }
    }
4

1 回答 1

0

我的博客文章的第 4 步和第 8 步显示了标准 PKCE 参数。

但是,通过 Postman 之类的工具重现整个流程是很棘手的,因为通常还需要遵循重定向并管理用户 + 密码的表单发布。

于 2020-08-26T12:21:36.160 回答