HttpURLConnection - 授权 header 始终为空
HttpURLConnection - Authorization header always is null
我正在尝试在 java spring mvc 中对 api 进行身份验证。
只是我的连接有问题,尤其是当我设置 setRequestProperty("Authorization", "***"); 时
总是 returns 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();
}
邮递员在我的 return 上,当我打电话时,它看起来像这样
为什么总是 null?
POSTgrant_type=client_credentials
401
Content-type:application/x-www-form-urlencoded
授权:空
我不能说为什么使用 Here API 的身份验证不起作用,但我可以解释为什么你的输出中 Authorization
得到 null
。
原因是 HttpURLConnection
class 在 JDK 中的执行明确拒绝 return 值 security-sensitive header s.
如果您看一下 getRequestProperty()
方法(在撰写本文时大约在 sun.net.www.protocol.http.HttpURLConnection 中的第 3367 行),您会发现该方法检查 header给出的是security-sensitiveheader中的一个,如果是,returnsnull
不管是否已经为这个[=40设置了值=]. Authorization
确实是被视为 security-sensitive 的 header 之一。
如果你想证明 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 并且我自己也从未使用过它。我建议从这里寻求支持。
我正在尝试在 java spring mvc 中对 api 进行身份验证。
只是我的连接有问题,尤其是当我设置 setRequestProperty("Authorization", "***"); 时 总是 returns 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();
}
邮递员在我的 return 上,当我打电话时,它看起来像这样 为什么总是 null?
POSTgrant_type=client_credentials 401 Content-type:application/x-www-form-urlencoded 授权:空
我不能说为什么使用 Here API 的身份验证不起作用,但我可以解释为什么你的输出中 Authorization
得到 null
。
原因是 HttpURLConnection
class 在 JDK 中的执行明确拒绝 return 值 security-sensitive header s.
如果您看一下 getRequestProperty()
方法(在撰写本文时大约在 sun.net.www.protocol.http.HttpURLConnection 中的第 3367 行),您会发现该方法检查 header给出的是security-sensitiveheader中的一个,如果是,returnsnull
不管是否已经为这个[=40设置了值=]. Authorization
确实是被视为 security-sensitive 的 header 之一。
如果你想证明 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 并且我自己也从未使用过它。我建议从这里寻求支持。