【问题标题】:how to send/POST JWT token from Android to Laravel backend如何从 Android 向 Laravel 后端发送/发布 JWT 令牌
【发布时间】:2016-10-17 01:12:48
【问题描述】:

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

  1. 通过后端身份验证后登录 mob 应用。
  2. 将数据上传到后端(后端是带有 Laravel 框架的 PHP)。

我先发邮件和密码到后台,得到了JWTtoken的回复,如图:

“eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEsImlzcyI6Imh0dHA6XC9cLzE5Mi4xNjguMS4xMDI6ODAwMFwvYXBpXC92M1wvYXV0aGVudGljYXRlIiwiaWF0IjoxNDY2MDA5OTY3LCJleHAiOjE0NjYwMTM1NjcsImp0aSI6IjZjYjBlMTRjYTNkMjAzM2Q4OWM0NzM1M2ZjNjMzZTU2In0.GJGUjgy8U-uqjLSqJcysDTmgrNvxBHH03iBflLjsOwA” P>

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

所以我的问题在于将相同的令牌发送回后端。这看起来简单直接,因为我已经开始与我的后端进行通信,并且我还使用 post man 检查了我的回复。

我还可以使用邮递员上的 jwt 令牌获取用户密码。

现在适用于邮递员的相同令牌不适用于我的 android。我知道我的 httpClient 和 httpPost 正在工作,因为我已经发送了电子邮件和密码。我也知道我的 android post 请求正在到达服务器,因为我返回的结果带有我为接受的令牌请求构建的错误消息,如下所示。

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

这就是为什么我认为我的令牌无法正确发送到服务器的原因。但我无法解决问题。但我猜令牌大小很大,长度为 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 导致的错误

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

【问题讨论】:

标签: android laravel-5 jwt


【解决方案1】:

也许尝试改用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 并了解更多信息。

【讨论】:

  • StringBody 和 MultipartEntity 类不存在,我也无法导入它
  • 我已经更新了答案并改用MultipartEntityBuilder - 看看你是否能够导入这个 - 另外,请确认你的HttpClient 库版本。
  • 我已经导入了 MultipartEntityBuilder,但是当我运行它时会崩溃。我用来导入它的库是。 'compile' "'org.apache.httpcomponents:httpcore:4.2.4'" 'compile' "'org.apache.httpcomponents:httpmime:4.3'" ... HttpClient 库内置于 IntelliJ IDEA ( org.apache .http.client.HttpClient)
  • 您能否更新您的问题并粘贴错误日志?我想看看是什么原因导致了崩溃。
【解决方案2】:

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

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;
}

【讨论】:

    猜你喜欢
    • 2020-11-22
    • 2021-01-07
    • 2022-07-08
    • 2020-06-08
    • 2021-01-31
    • 1970-01-01
    • 2019-01-06
    • 2021-12-26
    • 2019-11-14
    相关资源
    最近更新 更多