Php 使用csrf令牌从android应用程序访问laravel应用程序

Php 使用csrf令牌从android应用程序访问laravel应用程序,php,android,json,laravel,csrf,Php,Android,Json,Laravel,Csrf,我正在学习laravel框架,我已经安装了5.0版本。 我将其用于json api服务,该服务将在调用特定路由后提供json输出。 如果我从浏览器中请求URL,效果会非常好。但当我试图从android应用程序访问时,它会给出一个错误,即文件未找到异常(java.io.filenotfoundexception)。 在检查日志后,我发现laravel出现了令牌不匹配异常错误。laravel需要csrf令牌才能访问it资源。 我可以选择禁用该身份验证,但这种方式似乎不太安全 我可以允许从我的andr

我正在学习laravel框架,我已经安装了5.0版本。 我将其用于json api服务,该服务将在调用特定路由后提供json输出。 如果我从浏览器中请求URL,效果会非常好。但当我试图从android应用程序访问时,它会给出一个错误,即文件未找到异常(java.io.filenotfoundexception)。 在检查日志后,我发现laravel出现了令牌不匹配异常错误。laravel需要csrf令牌才能访问it资源。 我可以选择禁用该身份验证,但这种方式似乎不太安全


我可以允许从我的android应用程序而不是其他应用程序访问laravel应用程序吗?我们可以从android应用程序中指定csrf密钥吗

如果不想禁用CSRF令牌,则需要在一个请求中检索CSRF,然后将检索到的令牌与POST请求一起传递

// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();

// Get the CSRF token
httpClient.execute(new HttpGet("http://www.yoursite.com/"));
CookieStore cookieStore = httpClient.getCookieStore();
List <Cookie> cookies =  cookieStore.getCookies();
for (Cookie cookie: cookies) {
    if (cookie.getName().equals("XSRF-TOKEN")) {
        CSRFTOKEN = cookie.getValue();
    }
}

// Access POST route using CSRFTOKEN
HttpPost httppost = new HttpPost("http://www.yoursite.com/your-post-route");

try {
    // Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("_token", CSRFTOKEN));
    nameValuePairs.add(new BasicNameValuePair("stringdata", "Hello!"));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

    // Execute HTTP Post Request
    HttpResponse response = httpclient.execute(httppost);

} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
} catch (IOException e) {
    // TODO Auto-generated catch block
}
//创建新的HttpClient和Post头
HttpClient HttpClient=新的DefaultHttpClient();
//获取CSRF令牌
httpClient.execute(新的HttpGet(“http://www.yoursite.com/"));
CookieStore CookieStore=httpClient.getCookieStore();
List cookies=cookieStore.getCookies();
用于(Cookie:cookies){
if(cookie.getName().equals(“XSRF-TOKEN”)){
CSRFTOKEN=cookie.getValue();
}
}
//使用CSRFTOKEN访问POST路由
HttpPost HttpPost=新的HttpPost(“http://www.yoursite.com/your-post-route");
试一试{
//添加您的数据
List nameValuePairs=新的ArrayList(2);
添加(新的BasicNameValuePair(“_token”,CSRFTOKEN));
添加(新的BasicNameValuePair(“stringdata”,“Hello!”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
//执行HTTP Post请求
HttpResponse response=httpclient.execute(httppost);
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
}捕获(IOE异常){
//TODO自动生成的捕捉块
}
我试过了

...
nameValuePairs.add(new BasicNameValuePair("_token", CSRFTOKEN));
...
但它不起作用

如果你能试试的话

request.addHeader("X-CSRF-Token", token);

这对我来说是可行的

但是通过使用我认为任何android应用程序都可以访问我的apiCorrect,限制谁可以使用你的应用程序是一个“身份验证/授权”问题,而不是CSRF问题。CSRF只验证POST请求是否来自之前发出GET请求的同一客户端,它不限制谁可以使用该站点。我没听懂你的问题吗?我在同样的问题上需要帮助。我尝试了这个解决方案,但没能通过。请查查