对 oAuth2 Keycloak 服务器的 HTTPS 请求在 Xamarin 中向我返回 400 'Bad Request'

Posted

技术标签:

【中文标题】对 oAuth2 Keycloak 服务器的 HTTPS 请求在 Xamarin 中向我返回 400 \'Bad Request\'【英文标题】:HTTPS request to a oAuth2 Keycloak server return me 400 'Bad Request' in Xamarin对 oAuth2 Keycloak 服务器的 HTTPS 请求在 Xamarin 中向我返回 400 'Bad Request' 【发布时间】:2021-12-23 07:14:43 【问题描述】:

我正在翻译一个适用于 C#(Xamarin 应用程序)的 javascript 代码。我从服务器 400 'Bad Request' 中返回

我想知道我用 C# 编写的代码是正确的还是我遗漏了什么。

JS代码:

function requestTokens(code) 
    var codeVerifier = document.getElementById("codeVerifierValue").innerhtml;
    var data = 
        "grant_type": "authorization_code",
        "client_id": "clientid",
        "code": code,
        "code_verifier": codeVerifier,
        "redirect_uri": "https://redirectUrl"
    ;
    $.ajax(
        beforeSend: function (request) 
            request.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
        ,
        url: "https://myUrl",
        data: data,
        success: responseFromPostRequest,
        dataType: "json"
    );

C# 代码:

private HttpClient _httpClient = new HttpClient();

private async Task<string> HttpPost(string url, DataDto data)

    var jsonData = JsonConvert.SerializeObject(data);
    var content = new StringContent(jsonData, Encoding.UTF8, "application/x-www-form-urlencoded");

    var response = await _httpClient.PostAsync(new Uri(url), content);

感谢您的帮助

更新日志响应:

StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:

  Cache-Control: no-store
  Connection: keep-alive
  Date: Wed, 10 Nov 2021 17:37:43 GMT
  Pragma: no-cache
  Referrer-Policy: no-referrer
  Strict-Transport-Security: max-age=31536000; includeSubDomains
  X-android-Received-Millis: 1636565866035
  X-Android-Response-Source: NETWORK 400
  X-Android-Selected-Protocol: http/1.1
  X-Android-Sent-Millis: 1636565857210
  X-Content-Type-Options: nosniff
  X-Frame-Options: SAMEORIGIN
  X-XSS-Protection: 1; mode=block
  Content-Length: 84
  Content-Type: application/json

【问题讨论】:

你检查过服务器日志吗?你有调试服务器的权限吗?服务器端点的签名是什么? 在日志上我发现我看到了连接,但是日志不是很丰富所以没有给我回理由 @Jason 告诉你我用 c# 写的内容正确吗? 我不知道。尝试用wireshark之​​类的捕获请求,比较js和C#看看他们有什么不同 google.com/search?q=keycloak+log+request+site:***.com 【参考方案1】:

所以我发现在 Content-type application/x-www-form-urlencoded 的情况下,它不应该是要粘贴到 post 请求中的 JSON 文件。

有我发现的狙击代码:

public static async Task<TResult> PostFormUrlEncoded<TResult>(string url, IEnumerable<KeyValuePair<string, string>> postData)

    using (var httpClient = new HttpClient())
    
        using (var content = new FormUrlEncodedContent(postData))
        
            content.Headers.Clear();
            content.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

            HttpResponseMessage response = await httpClient.PostAsync(url, content);

            return await response.Content.ReadAsAsync<TResult>();
        
    

这样就完美了

【讨论】:

以上是关于对 oAuth2 Keycloak 服务器的 HTTPS 请求在 Xamarin 中向我返回 400 'Bad Request'的主要内容,如果未能解决你的问题,请参考以下文章

使用 Keycloak 构建 Java OAuth2.0 授权服务器

使用 KeyCloak 的 OAuth2 授权接口

Kong + Keycloak + OAuth:jwt-keycloak 还是 oauth2 插件?

如何使用 Angular -> Spring Boot Oauth2 -> Keycloak 获取 keycloak 令牌

通过 Spring Boot Keycloak 集成的 OAuth2 客户端凭据流

需要使用 Keycloak 和 oAuth2 保护普通 Spring REST API 的示例