【问题标题】:Is there a limit on Authorization header character length in JAVA?JAVA中的授权标头字符长度是否有限制?
【发布时间】:2020-12-20 10:14:35
【问题描述】:

我正在从一个 Android 应用程序发送一个 GET 请求,其中包括 AUTHORIZATION 标头。 当我在服务器上检查 auth.password 时,它被截断了。 原始字符串 60 个字符,服务器仅接收 48 个字符。 密码是一个散列字符串

下面是生成请求的函数的代码。

private String getToken(username, password){
        InputStream inputStream = null;
        String result = "";
        try {

            // create HttpClient

            HttpClient httpclient = new DefaultHttpClient();

            HttpGet httpGet= new HttpGet(url);

            String credentials= "";
            if (username.length != 0 && password.length != 0) ){
                credentials= username + ":"+ password
            }else {
                return "";
            }

            String encoding= Base64.encodeToString(credentials.getBytes("utf-8"),Base64.DEFAULT);
            httpGet.setHeader(HttpHeaders.HOST,SERVER);
            httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Basic " + encoding);

            // make GET request to the given URL
            HttpResponse httpResponse = httpclient.execute(httpGet);

            // receive response as inputStream
            inputStream = httpResponse.getEntity().getContent();

            // convert inputstream to string
            if(inputStream != null) {
                result = convertInputStreamToString(inputStream);

                result = new JSONObject(result).getString("token");
            }


        } catch (Exception e) {
            Log.d("InputStream", e.getLocalizedMessage());
            result= "";
        }

        return result;

    }
            

将变量编码解码回字符串为我提供了原始凭据 Log.e(TAG, "getToken: DECODED BYTES"+ new String(Base64.decode(encoding,0),"utf-8") );

从 Postman 发送相同的请求不会截断密码。

示例密码$2b$12$FywsqVzLrCR1iSVDLe7eBeK/.K07JUXX9YEHklyWPz9W7/nj52Xfa

服务器应用程序是用python编写的

【问题讨论】:

  • 您介意在您的问题中添加 JAVA 版本吗?另外,请求中所有标头的总大小?
  • JAVA 版本 >> openjdk 版本 "1.8.0_202-release" 。我不知道该怎么做,但是我的请求除了默认的 + AUTHORIZATION 标头之外没有任何其他标头
  • 明白了。由于 postman+JAVA 似乎在为您做正确的事情,但 android+JAVA 并没有……我怀疑问题不在于 JAVA 端点,而在于您的 android 应用程序发送的内容。你可以发布一些代码吗?还是您的问题已经存在?

标签: java android http-headers authorization


【解决方案1】:

所以这个问题的答案是改变这行代码 String encoding= Base64.encodeToString(credentials.getBytes("utf-8"),Base64.DEFAULT);

String encoding= Base64.encodeToString(credentials.getBytes("utf-8"),Base64.URL_SAFE| Base64.NO_WRAP);

这将保护 url 免受诸如 ' 之类的字符的影响。 '(点),尤其是加密密码。 如果你检查示例密码,点字符就在那里。

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多