Java 来自android应用程序的JWT身份验证

Java 来自android应用程序的JWT身份验证,java,android,apache,oauth-2.0,jwt,Java,Android,Apache,Oauth 2.0,Jwt,我是Android开发的新手,需要打电话到HTTP服务器上传图像。在此之前,用户使用用户名和密码登录,并返回JWT令牌和用户id。在图像上载功能中,我需要提供令牌和id,以便服务器在验证会话后接受图像,这就是我遇到问题的地方 我不确定问题是否存在于图像上传或会话验证中,尽管从错误消息来看,这似乎是第二种情况 功能如下: public String sendPostMult(String myurl, String token, List<ValuePair> params, Bitm

我是Android开发的新手,需要打电话到HTTP服务器上传图像。在此之前,用户使用用户名和密码登录,并返回JWT令牌和用户id。在图像上载功能中,我需要提供令牌和id,以便服务器在验证会话后接受图像,这就是我遇到问题的地方

我不确定问题是否存在于图像上传或会话验证中,尽管从错误消息来看,这似乎是第二种情况

功能如下:

public String sendPostMult(String myurl, String token, List<ValuePair> params, Bitmap bm) throws Exception {

    try {

        HttpClient client = new DefaultHttpClient();

        HttpPost post = new HttpPost(myurl);
        post.addHeader("Authorization", "Token token=\"" + token + "\"");
        MultipartEntityBuilder postEntity = MultipartEntityBuilder.create();

        ByteArrayOutputStream bao = new ByteArrayOutputStream();

        bm.compress(Bitmap.CompressFormat.PNG, 90, bao);

        byte[] ba = bao.toByteArray();

        String ba1 = Base64.encodeToString(ba, Base64.DEFAULT);

        // File file = new File("Your File path on SD card");
        // postEntity.addPart("fileupload", new FileBody(file, "image/jpeg"));
        for (ValuePair param : params) {
            postEntity.addTextBody(param.getValue(), param.getName());
            Log.d(param.getValue(), param.getName());
        }

        postEntity.addTextBody("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer");


        postEntity.addTextBody("client_assertion", token);

        postEntity.addTextBody("picture", ba1);
        // Log.d("YY", getBytesFromBitmap(bm).toString());
        post.setEntity(postEntity.build());

        HttpResponse response = client.execute(post);

        int responseCode = response.getStatusLine().getStatusCode();


        BufferedReader reader = new BufferedReader(new InputStreamReader(
                response.getEntity().getContent(), "UTF-8"));

        String sResponse = reader.readLine();

        return sResponse;

    }catch(Exception e)
    {
        e.printStackTrace();
        return "ERROR";
    }
}
因此,这似乎确实是一个jwt错误。如果我移除

post.addHeader("Authorization", "Token token=\"" + token + "\"");
行,错误显示:必须提供授权标头

因此,我的问题是:

1) 授权标头是否正确?还是应该采用另一种格式

2) 如何通过JWT?我收到了一个字符串形式的令牌,我想这就是我需要传递的。然而,当我收到令牌时,它确实包含几个字段,我将这些字段解析为不同的字符串,令牌就是其中之一。所以,也许我应该保存整个内容并将其全部发送到客户机断言字段?但我是否仍应仅在授权标头中发送令牌

3) 虽然有点不相关,但可能是我发送的图像格式错误吗


非常感谢您抽出时间。我真的很感激

看看JWT,你的问题就在那里。它不是JWT令牌

JWT由三部分组成:
。您的仅包含
。我怀疑您有JWS(JSON Web签名)而不是JWT(JSON Web令牌)

您可以在规范中阅读有关格式的信息:

如果需要对令牌进行故障排除,这是一个有用的工具:


此外,像您这样在声明中发送密码似乎是一件倒退的事情,即使它是加密的。JWT不是向每个服务发送密码。服务通过验证签名来信任内容。

如果您想知道JWT的样子:{“令牌”:“EYJ0Exiaioijkv1qiljhijiuzi1nij9.EYJLbwfpbci6im9saubvgbgkuy29tiiwicgfzc3dvcmqioiiiijmwkdukzevpymhruzllmwrw9wtu5wndrli5rr1vimwnfu9hawk9hawqpNqwdstbrstbrsbfRk8ilcjfawqoi1和vymyzmyzm5yzmzmzm5zmotjfx3yioj9.vopftns4wffg9.wfg9.wfgͬ”dupxc9;“dupxc9c9c9c9c9c9c9c9c9c9c9c9c9f5”;“vjjjjjjjjj
post.addHeader("Authorization", "Token token=\"" + token + "\"");