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 并且我自己也从未使用过它。我建议从这里寻求支持。