我正在构建一个使用身份验证令牌对用户进行身份验证的Laravel API。对于需要身份验证的任何路由,我都将它们包装在auth
过滤器中:
Route::group(array('before' => 'auth'), function() {
Route::get('user/account', 'UserController@getAccountDetails');
});
我的auth
过滤器基本上解密传入的身份验证令牌并检查它是否有效:
Route::filter('auth', function()
{
// Try catch because Crypt::decrypt throws an exception if it's not a valid string to decrypt
try {
$authToken = Crypt::decrypt(Request::header('Authorization'));
// If there's a user tied to this auth token, it's valid
$user = AuthToken::where('token', '=', $authToken)->first()->user()->first();
if (!$user) {
throw new \Exception();
}
// Make the user globally accessible in controllers
} catch (\Exception $e) {
return Response::json([
'data' => [
'error' => 'You must be logged in to access this resource.'
],
'success' => false,
'status' => 403
], 403);
}
});
非常简单的东西,但我仍然坚持下一部分。我希望能够轻松检索控制器和模型中的当前用户记录。
例如,如果我使用Laravel的Auth
库,我可以通过控制器中的Auth::user()
来获取当前用户。我希望拥有这种功能,但我不确定如何构建它。我可以编写一个在使用返回User
模型的静态方法进行身份验证后实例化的类吗?
答案 0 :(得分:2)
不确定这是否是您的选择,但也许您想使用oauth2而不是写#34;您自己的"基于令牌的身份验证?
laravel项目有一个非常好的ouath2服务器包装器:oauth2-server-laravel。
根据它的文档,您可以(例如密码流认证)将其放入其配置中:
'password' => array(
'class' => 'League\OAuth2\Server\Grant\Password',
'access_token_ttl' => 604800,
'callback' => function($username, $password){
$credentials = array(
'email' => $username,
'password' => $password,
);
$valid = Auth::validate($credentials);
if (!$valid) {
return false;
}
return Auth::getProvider()->retrieveByCredentials($credentials)->id;
}
)
除此之外,你可以通过发送邮件请求进行身份验证(在这种情况下通过用户名和密码):
POST https://www.example.com/oauth/access_token?
grant_type=password&
client_id=the_client_id&
client_secret=the_client_secret&
username=the_username&
password=the_password&
scope=scope1,scope2&
state=123456789
请求将返回生成的令牌,然后您可以像往常一样进行api调用,只需将令牌放入发布数据中。
在你的api逻辑中,通过令牌获取用户非常简单,只需运行:
User::find(ResourceServer::getOwnerId());
它会产生类似:刷新令牌,其他授权流程,范围访问,客户端管理等等。开箱即用。
您还可以保护任何特定路线:
Route::get('secure-route', array('before' => 'oauth', function(){
return "oauth secured route";
}));
您可以在oauth2-server-laravel文档中找到更多详细信息:https://github.com/lucadegasperi/oauth2-server-laravel
和oauth2文档:http://oauth.net/documentation/
答案 1 :(得分:0)
Auth::user()
方法确实非常方便。那么,为什么不简单地扩展Auth
类来编写自己的身份验证驱动程序呢?您可以找到所有需要的文档here。
然后你就可以使用Auth
外观,就像你可以编写的所有其他laravel应用程序一样......太棒了,不是吗?