[英]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.