Search code examples
c#laraveloauthrest-clientlaravel-passport

laravel passport: why the same code works with Http Get request but doesn't work with POST?


I have a Laravel application and a C# application that connects to it via Passport.

I made simple functions to make the user update his password like this:

Laravel Route

Route::post('user/updatepassword','UserController@changepassword')->middleware('auth:api');

Laravel Controller

public function changepassword(Request $request)
{
    $this->validate($request, [ 'password' => 'required|string|max:255' ]);

    $newuser = User::find(Auth::user()->id);
    $newuser->password = bcrypt($request->password);
    $newuser->save();
}

C# Function

public string UpdatePassword(string password)
{
    var client = new RestClient(APPConnection.ApiRoot + "user/updatepassword");
    //// client.Authenticator = new HttpBasicAuthenticator(username, password);

    var request = new RestRequest("", Method.POST);
    request.AddParameter("password", password); // adds to POST or URL querystring based on Method
    request.AddHeader("Authorization", "Bearer " + Current_User.access_token);

    // execute the request
    IRestResponse response = client.Execute(request);
    var content = response.Content; // raw content as string

    return content;
}

This code doesn't work, and it throws a lot of exceptions that are meaningless, or, at least, I can't figure it out. However, when I change everything to use HTTP GET requests on both the C# code and Laravel end, it works fine.

I'm not sure what is wrong. It may be that the way I'm passing the token should be different for the GET and the POST request.

Here is a copy of the response I get:

{
  "message": "",
  "exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException",
  "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Exceptions\\Handler.php",
  "line": 203,
  "trace": [
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Exceptions\\Handler.php",
      "line": 175,
      "function": "prepareException",
      "class": "Illuminate\\Foundation\\Exceptions\\Handler",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplication\\app\\Exceptions\\Handler.php",
      "line": 51,
      "function": "render",
      "class": "Illuminate\\Foundation\\Exceptions\\Handler",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 83,
      "function": "render",
      "class": "App\\Exceptions\\Handler",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 55,
      "function": "handleException",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\View\\Middleware\\ShareErrorsFromSession.php",
      "line": 49,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Illuminate\\View\\Middleware\\ShareErrorsFromSession",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php",
      "line": 63,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Illuminate\\Session\\Middleware\\StartSession",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse.php",
      "line": 37,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Cookie\\Middleware\\EncryptCookies.php",
      "line": 59,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Illuminate\\Cookie\\Middleware\\EncryptCookies",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 102,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 647,
      "function": "then",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 622,
      "function": "runRouteWithinStack",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 588,
      "function": "runRoute",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Router.php",
      "line": 577,
      "function": "dispatchToRoute",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
      "line": 176,
      "function": "dispatch",
      "class": "Illuminate\\Routing\\Router",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 30,
      "function": "Illuminate\\Foundation\\Http\\{closure}",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\fideloper\\proxy\\src\\TrustProxies.php",
      "line": 56,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Fideloper\\Proxy\\TrustProxies",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php",
      "line": 30,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php",
      "line": 30,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php",
      "line": 27,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode.php",
      "line": 46,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 149,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Routing\\Pipeline.php",
      "line": 53,
      "function": "Illuminate\\Pipeline\\{closure}",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Pipeline\\Pipeline.php",
      "line": 102,
      "function": "Illuminate\\Routing\\{closure}",
      "class": "Illuminate\\Routing\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
      "line": 151,
      "function": "then",
      "class": "Illuminate\\Pipeline\\Pipeline",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplicationendor\\laravel\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php",
      "line": 116,
      "function": "sendRequestThroughRouter",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    },
    {
      "file": "C:\\xampp\\htdocs\\myefapplication\\public\\index.php",
      "line": 55,
      "function": "handle",
      "class": "Illuminate\\Foundation\\Http\\Kernel",
      "type": "->"
    }
  ]
}

Solution

  • I don't know why your exception output is so horrible, but you're running into a CSRF token mismatch exception.

    Laravel expects a CSRF token by default on all POST routes in the web middleware. All routes defined inside the routes/web.php file are placed inside the web middleware group.

    If this is meant to be an API endpoint (which, given that you're using passport, I assume it is), your route should be defined inside the routes/api.php file. By doing this, it is placed in the api middleware group instead of the web middleware group. This will remove the CSRF token restriction, among other things.