使用csrf令牌

时间:2015-07-25 14:28:30

标签: php android json laravel csrf

我正在倾斜laravel框架,我已经安装了5.0版本。 我将它用于json api服务,它将在调用某些路由后给出JSON输出。 如果我从浏览器中获取URL,它的效果非常好。但是当我尝试从我的Android应用程序访问时,它会给出错误,即文件未找到异常(java.io.filenotfoundexception)。 检查日志后我得到了laravel有Token Mismatch Exception错误的点。 laravel需要csrf令牌来访问它的资源。 我有选择,我可以禁用该身份验证,但它似乎不太安全。

可以以某种方式我可以允许从我的Android应用程序访问laravel应用程序而不是从其他应用程序?我们可以从Android应用程序指定csrf键吗?

2 个答案:

答案 0 :(得分:12)

如果您不想禁用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
}

答案 1 :(得分:0)

我尝试了

...
nameValuePairs.add(new BasicNameValuePair("_token", CSRFTOKEN));
...

但这不起作用

如果可以尝试

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

对我有用