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

Posted

技术标签:

【中文标题】使用 csrf 令牌从 android 应用程序访问 laravel 应用程序【英文标题】:access laravel app from android app with csrf token 【发布时间】:2015-10-16 03:02:21 【问题描述】:

我正在学习 laravel 框架,我已经安装了 5.0 版本。 我将它用于 json api 服务,该服务将在调用特定路由后提供 JSON 输出。 如果我从浏览器请求 URL,它会很好地工作。但是当我尝试从我的 android 应用程序访问时,它会给出错误,即找不到文件异常(java.io.filenotfoundexception)。 检查日志后,我发现 laravel 有 Token Mismatch Exception 错误。 laravel 需要 csrf 令牌来访问它的资源。 我可以选择禁用该身份验证,但它似乎不太安全。

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

【问题讨论】:

【参考方案1】:

我试过了

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

但它不起作用

如果可以试试

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

对我有用

【讨论】:

【参考方案2】:

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

【讨论】:

但是通过使用我认为任何 android 应用程序都可以访问我的 api 正确,限制谁可以使用您的应用程序是“身份验证/授权”问题,而不是 CSRF 问题。 CSRF 仅验证 POST 请求是否来自发出先前 GET 请求的同一客户端,它不限制谁可以使用该站点。我有没有听错你的问题? 我需要帮助解决同样的问题。我尝试了这个解决方案,但无法通过。请查***.com/questions/38672539/…

以上是关于使用 csrf 令牌从 android 应用程序访问 laravel 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中获取 CSRF 令牌?

你如何在 django rest 框架中实现 CSRF 令牌?

使用新访问令牌在 android 上使用 asmack 进行 Facebook 聊天

如何从 Django 在前端获取 CSRF 令牌以及如何在 Postman 中使用它

将 CSRF 令牌从节点传递给 REACT/FLUX

如何以及在何处生成 CSRF 令牌以通​​过 REST API 向 Django 应用程序发出请求?