使用 csrf 令牌从 android 应用程序访问 laravel 应用程序
access laravel app from android app with csrf token
我正在学习laravel框架,我安装了5.0版本。
我将它用于 json api 服务,在调用特定路由后将提供 JSON 输出。
如果我从浏览器请求 URL,它工作得很好。但是当我试图从我的 android 应用程序访问时,它给出了错误文件未找到异常 (java.io.filenotfoundexception)。
检查日志后,我发现 laravel 有令牌不匹配异常错误。 laravel 需要 csrf 令牌才能访问它的资源。
我可以选择禁用该身份验证,但它似乎不太安全。
我能否以某种方式允许从我的 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
}
我试过了
...
nameValuePairs.add(new BasicNameValuePair("_token", CSRFTOKEN));
...
但是不行
如果你可以试试
request.addHeader("X-CSRF-Token", token);
对我有用
我正在学习laravel框架,我安装了5.0版本。 我将它用于 json api 服务,在调用特定路由后将提供 JSON 输出。 如果我从浏览器请求 URL,它工作得很好。但是当我试图从我的 android 应用程序访问时,它给出了错误文件未找到异常 (java.io.filenotfoundexception)。 检查日志后,我发现 laravel 有令牌不匹配异常错误。 laravel 需要 csrf 令牌才能访问它的资源。 我可以选择禁用该身份验证,但它似乎不太安全。
我能否以某种方式允许从我的 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
}
我试过了
...
nameValuePairs.add(new BasicNameValuePair("_token", CSRFTOKEN));
...
但是不行
如果你可以试试
request.addHeader("X-CSRF-Token", token);
对我有用