Why even bother with CSRF token. Just use JWT token with routes that don't need CSRF token. If you really want to use CSRF tokens. Then login get your JWT token and when a CSRF token expires use a JWT protected call to get a new one.
Route::get('token', ['middleware' => 'jwt.auth', function () {
//response()->myMessage(csrf_token());
$token = JWTAuth::getToken();
return (new Response(csrf_token()))->header('Authorization', 'Bearer ' . $token->get());
//return new Response(csrf_token());
}]);
This gets a fresh CSRF token and refreshed JWT token (when expired).
Here is a modified Tymons middleware example of JWT auth.
<?php
namespace Tymon\JWTAuth\Middleware;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
class GetUserFromToken extends BaseMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, \Closure $next)
{
$expired = false;
if (! $token = $this->auth->setRequest($request)->getToken()) {
return $this->respond('tymon.jwt.absent', 'token_not_provided', 400);
}
try {
$user = $this->auth->authenticate($token);
} catch (TokenExpiredException $e) {
//return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
$expired = true;
} catch (JWTException $e) {
return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
}
if ($expired) {
try {
$newToken = $this->auth->setRequest($request)
->parseToken()
->refresh();
$user = $this->auth->authenticate($newToken);
} catch (TokenExpiredException $e) {
return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]);
} catch (JWTException $e) {
return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]);
}
// send the refreshed token back to the client
$request->headers->set('Authorization', 'Bearer ' . $newToken);
}
if (! $user) {
return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404);
}
$this->events->fire('tymon.jwt.valid', $user);
return $next($request);
}
}