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

ddw*_*147 7 php android json csrf laravel

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

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

Ben*_*aar 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
}
Run Code Online (Sandbox Code Playgroud)

  • 正确,限制谁可以使用您的应用程序是"身份验证/授权"问题,而不是CSRF问题.CSRF仅验证POST请求来自发出先前GET请求的同一客户端,它不限制谁可以使用该站点.我错过了解你的问题吗? (3认同)