【问题标题】:access laravel app from android app with csrf token使用 csrf 令牌从 android 应用程序访问 laravel 应用程序
【发布时间】: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 密钥吗?

【问题讨论】:

    标签: php android json laravel 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 请求的同一客户端,它不限制谁可以使用该站点。我有没有听错你的问题?
      • 我需要帮助解决同样的问题。我尝试了这个解决方案,但无法通过。请查stackoverflow.com/questions/38672539/…
      猜你喜欢
      • 2011-09-21
      • 2021-01-14
      • 1970-01-01
      • 2012-06-21
      • 2013-08-05
      • 2021-10-17
      • 2016-12-17
      • 2011-04-30
      • 2017-09-19
      相关资源
      最近更新 更多