我目前正在将代码库移植到更多RESTful模式,以便我可以从单个API运行移动应用程序和Web应用程序。
我知道laravel 5.3现在实现了Laravel Passport,但我如何使用自己的API,即用户注册获取身份验证令牌/ api令牌然后每个请求到服务器检查该令牌,到目前为止我有以下,在我的api路线中,
Route::group(['middleware' => 'auth:api'], function () {
Route::get('classes', 'ClassController@index');
Route::get('classes/{id}', 'ClassController@show');
Route::post('classes', 'ClassController@create');
Route::put('classes', 'ClassController@edit');
Route::delete('classes', 'ClassController@destroy');
});
在我的Http / kernal.php中,我添加了
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class
到我的$ middleWareGroups数组。
那么如何为我的用户生成身份验证密钥,即当他们登录时如何向该用户添加令牌?
答案 0 :(得分:3)
我正在为来到这里的未来用户回答这个问题,因为他们的API在尝试使用自己的API时响应“未经过身份验证”。
OPs问题:“那么如何为我的用户生成身份验证密钥,即当他们登录时如何向该用户添加令牌?”
答案:如果您通过CreateFreshAPIToken中间件使用自己的API,则无需生成特殊的身份验证密钥/令牌。身份验证通过“laravel_token”cookie完成,该cookie在添加CreateFreshApiToken中间件时会附加到您的响应中。
当收到发送此cookie的请求时,此嵌入式令牌将通过护照解密。
对于在遵循使用自己的API的文档中的所有步骤后仍然收到“未经过身份验证”的消息的人:
如果没有为您的路线组定义Laravel Middleware Illuminate \ Cookie \ Middleware \ EncryptCookies ,则整个概念将无效。 这些信息不是由文档提供的。这完全有道理。如果cookie从未加密,则无法对其进行解密,因此Passport提供的TokenGuard中始终存在DecryptException。
默认情况下,为所有请求配置此中间件,在Kernel.php中看起来像这样:
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
];
}
如果不是,则应添加它。
希望我可以帮助一些人在他们的眼睛里流着眼泪来到这里。
答案 1 :(得分:0)
要使用自己的api,使用其他前端框架,您需要为每个AJAX请求添加一个请求标头:将标头X-CSRF-TOKEN设置为等于该页面的CSRF标记。
例如:使用Javascript
$.ajax({
url: $url,
headers:{'X-CSRF-TOKEN': Laravel.csrfToken},
type: $type,
dataType: $dataType,
async: $async,
data: $data,
});