如何从Android向Laravel后端发送/ POST JWT令牌

时间:2016-06-15 18:53:53

标签: android laravel-5 jwt

我想使用Android手机访问我的后端。此刻我想做两件事:

  1. 在从后端进行身份验证后登录mob应用程序。
  2. 将数据上传到后端(后端是使用Laravel Framework的PHP)。
  3. 我首先向后端发送电子邮件和密码,并获得JWT令牌的回复,如下所示:

    " eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEsImlzcyI6Imh0dHA6XC9cLzE5Mi4xNjguMS4xMDI6ODAwMFwvYXBpXC92M1wvYXV0aGVudGljYXRlIiwiaWF0IjoxNDY2MDA5OTY3LCJleHAiOjE0NjYwMTM1NjcsImp0aSI6IjZjYjBlMTRjYTNkMjAzM2Q4OWM0NzM1M2ZjNjMzZTU2In0.GJGUjgy8U-uqjLSqJcysDTmgrNvxBHH03iBflLjsOwA"

    一旦上述令牌返回到mob应用程序,我想发送相同的返回令牌以进一步发布请求,因为上面的jwt令牌是我访问后端的密钥。

    所以我的问题在于将相同的令牌发送回后端。因为我已经开始与我的后端沟通,所以看起来简单而且直截了当,我也通过使用帖子来检查我的回复。

    loging in

    我也可以使用postman上的jwt令牌获得用户cridential。

    postman receive user cridentials as json

    现在对邮递员起作用的同一令牌对我的机器人不起作用。我知道我的httpClient和httpPost正在运行,因为我已经发送了它的电子邮件和密码。我也知道我的android帖子请求到达了服务器,因为我的返回结果附带了我为接受的令牌请求构建的错误消息,如下所示。

    when android recives user cridentials as json

    从上面的快照中可以看出。当发布用于身份验证时,我首先在引号内(首先突出显示)获取令牌。所以我删除了引用并发布了相同的令牌获取用户cridential但这次我收到了一个错误响应,我在后端建立了它。

    这就是为什么我认为我的令牌不能正常进入服务器。但我无法解决问题。但我猜测令牌大小很大,长度为490.那么如何将我的令牌附加到httpPost请求?构建请求的代码如下所示:

    public String getJsonString2(String url, String jwtString) {
    
            String jsonString = "";
    
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            List nameValuePair = new ArrayList(1);
            nameValuePair.add(new BasicNameValuePair("token", jwtString));
            try {
                httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
            }
            catch (UnsupportedEncodingException e) {
                // writing error to Log
                e.printStackTrace();
            }
    
            // Making HTTP Request
            try {
                HttpResponse response = httpClient.execute(httpPost);
                jsonString = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
    
            } catch (ClientProtocolException e) {
                // writing exception to log
                e.printStackTrace();
    
            } catch (IOException e) {
                // writing exception to log
                e.printStackTrace();
            }
    
            return jsonString;
    
        }
    

    我也尝试使用MultipartEntityBuilder来解析参数(在我的情况下是令牌)但是MultipartEnityBuilder库在构建时正在编写我的程序:

    使用以下依赖项将MultipartEnityBuilder库添加到我的项目中:

    //for accessing the MultipartEntity lbrary
    compile "org.apache.httpcomponents:httpcore:4.2.4"
    compile "org.apache.httpcomponents:httpmime:4.3"
    
    由于MultipartEntity

    错误

    build error for the MultipartEntity library

    所以现在我的问题是:      如何将jwt令牌值从android发送到Laravel后端。

2 个答案:

答案 0 :(得分:0)

也许尝试使用MultipartEntity代替并为代币创建“部分”。我已将this closely related answer改编为您的案例:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
//here you create the token body    
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody("token", jwtString, ContentType.TEXT_PLAIN);
HttpEntity reqEntity = builder.build();
httppost.setEntity(reqEntity);

HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();

我希望这会有所帮助,请试一试并告诉我。

您可以访问此blog on Multipart Upload with HttpClient并了解详情。

答案 1 :(得分:0)

我设法通过简单地使用令牌设置Authorization标头来解决我的问题:

public String getJsonString2(String url, String jwtString) {

    String jsonString = "";

    // Creating HTTP client and post
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost(url);

    httpPost.setHeader("Authorization", "Bearer \\{" +  jwtString + "\\}");

    // Making HTTP Request
    try {
        HttpResponse response = httpClient.execute(httpPost);
        jsonString = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
        System.out.println("Http String content: " + jsonString);
    } catch (ClientProtocolException e) {
        // writing exception to log
        e.printStackTrace();
    } catch (IOException e) {
        // writing exception to log
        e.printStackTrace();
    }
    return jsonString;
}