簡體   English   中英

HttpURLConnection - 授權 header 始終為 null

[英]HttpURLConnection - Authorization header always is null

我正在嘗試在 java spring mvc 中對 api 進行身份驗證。

只是我的連接有問題,尤其是當我設置 setRequestProperty("Authorization", "***"); 總是返回 401 錯誤我有什么問題?

 try {
            URL url = new URL("https://account.api.here.com/oauth2/token");
            conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Authorization", "OAuth oauth_consumer_key=\"*******************\",oauth_signature_method=\"HMAC-SHA256\",oauth_timestamp=\"1633463792\",oauth_nonce=\"******\",oauth_version=\"1.0\",oauth_signature=\"**************\"");

            //   conn.setRequestProperty("Authorization", "OAuth");
         //   conn.setRequestProperty("oauth_consumer_key", "*******************");
         //   conn.setRequestProperty("oauth_nonce", "********");
         //   conn.setRequestProperty("oauth_signature", "*******");
         //   conn.setRequestProperty("oauth_signature_method", "HMAC-SHA256");
         //   conn.setRequestProperty("oauth_timestamp", "1633463792");
         //   conn.setRequestProperty("oauth_version", "1.0");


            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.setDoOutput(true);
            OutputStream os = conn.getOutputStream();
            os.write(POST_PARAMS.getBytes());
            os.flush();
            os.close();

            int responseCode = conn.getResponseCode();
            return conn.getRequestMethod() +os + "\n"+responseCode + "\nContent-type:"+ conn.getRequestProperty("Content-Type") + "\nAuthorization: "+ conn.getRequestProperty("Authorization");
          }catch (Exception e){
            e.printStackTrace();
        }
            
  

在我打電話時由 postman 返回時,它看起來像這樣為什么總是 null?

POSTgrant_type=client_credentials 401 內容類型:application/x-www-form-urlencoded 授權:null

在此處輸入圖像描述

我不能說為什么使用 Here API 的身份驗證不起作用,但我可以解釋為什么您在 output 中獲得null進行Authorization

原因是 JDK 中HttpURLConnection class 的實現明確拒絕返回安全敏感標頭的值。

如果您看一下getRequestProperty()方法(在撰寫本文時,這大約是sun.net.www.protocol.http.HttpURLConnection中的第 3367 行),那么您會看到該方法檢查給定的 header 是否為許多安全敏感標頭之一,如果是,則返回null ,無論是否為此 header 設置了值。 Authorization確實是被認為是安全敏感的標頭之一。

如果要證明Authorization header 的值已經設置,可以嘗試如下:

java.lang.reflect.Field requestsField = conn.getClass().getDeclaredField("requests");
requestsField.setAccessible(true);
System.out.println(requestsField.get(conn));

對我來說,這打印出類似sun.net.www.MessageHeader@52a863563 pairs: {Authorization=...}...的內容,表明Authorization header 確實已設置。 但是請注意,這段代碼是令人討厭的反射性黑客,雖然它適用於我的 JDK 11,但我不保證它適用於其他版本的 Java。

總之,我相信您正在設置授權 header。 您可能將其設置為不正確的值,但恐怕我無法幫助您將其設置為工作值,因為我無法訪問 Here API 並且自己從未使用過它。 我建議從這里尋求支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM