tfleet / tf-auth-token
身份验证令牌管理
Requires
- php: >=5.3.0
- illuminate/support: ~4.1
Requires (Dev)
- mockery/mockery: 0.8.*
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-09-28 16:05:09 UTC
README
集成到 Laravel 身份验证模块,在成功时提供身份验证令牌。此令牌仅在 https 环境中真正安全。此模块的主要目的是为 JavaScript 网页应用程序提供身份验证令牌,该令牌可用于在 API 调用中识别用户。
升级到 Laravel 4.1?请参阅 重大变更
基于 https://github.com/tappleby/laravel-auth-token。
入门指南
设置
将包添加到您的 composer.json
"require": {
...
"tfleet/tf-auth-token": "dev-master"
}
将服务提供程序添加到 app/config/app.php
'tfleet\AuthToken\AuthTokenServiceProvider',
在 app/config/app.php
中设置可选别名
'AuthToken' => 'TFleet\Support\Facades\AuthToken',
'AuthTokenNotAuthorizedException' => 'TFleet\AuthToken\Exceptions\NotAuthorizedException'
当前身份验证令牌存储在数据库中,您需要运行迁移
php artisan migrate --package=tfleet/tf-auth-token
可选配置
此包默认使用电子邮件作为用户名字段进行验证,这可以通过包配置进行更改。
- 发布配置
php artisan config:publish tfleet/laravel-auth-token
- 编辑
app/config/packages/tfleet/laravel-auth-token/config.php
中的format_credentials
闭包
示例 - 仅验证活动用户并检查用户名列而不是电子邮件
'format_credentials' => function ($username, $password) {
return array(
'username' => $username,
'password' => $password,
'active' => true
);
}
您可以在这里了解更多关于 Laravel 身份验证模块的信息: 用户身份验证
控制器
提供了一个默认控制器,用于授予、检查和吊销令牌。将以下内容添加到 app/routes.php
Route::get('auth', 'Tfleet\AuthToken\AuthTokenController@index');
Route::post('auth', 'Tfleet\AuthToken\AuthTokenController@store');
Route::delete('auth', 'Tfleet\AuthToken\AuthTokenController@destroy');
CORS 支持
此库默认不包含 CORS 支持,可以通过以下包启用: barryvdh/laravel-cors。
配置将根据您的路由设置而具体。如果您使用的是 X-Auth-Token
标头,则将此添加到 allowedHeaders
配置中非常重要。有关进一步配置的详细信息,请参阅包文档。
以下是一个使用默认 auth
路由的示例
'paths' => array(
'auth' => array(
'allowedOrigins' => array('*'),
'allowedHeaders' => array('Content-Type', 'X-Auth-Token'),
'allowedMethods' => array('POST', 'PUT', 'GET', 'DELETE'),
'maxAge' => 3600,
)
),
注意:如果知道
allowedOrigins
列表,则最好显式定义它们,而不是使用通配符*
请求参数
所有请求都必须包含以下之一
X-Auth-Token
标头。auth_token
字段。
GET
索引操作
返回当前用户作为 JSON。需要存在身份验证令牌参数。失败时抛出 NotAuthorizedException
。
POST
存储操作
必需输入 username
和 password
。成功时返回包含 token
和 user
的 JSON 对象。失败时抛出 NotAuthorizedException
。
DELETE
销毁操作
清除用户令牌。需要存在身份验证令牌参数。失败时抛出 NotAuthorizedException
。
NotAuthorizedException
默认具有 401
错误代码。
路由过滤器
服务提供程序会注册 auth.token
路由过滤器。要保护资源,只需注册一个前置过滤器。如果有效的身份验证令牌无效或不存在,则过滤器会抛出 NotAuthorizedException
。
Route::group(array('prefix' => 'api', 'before' => 'auth.token'), function() {
Route::get('/', function() {
return "Protected resource";
});
});
事件
当提供有效的身份验证令牌时,路由过滤器将触发 auth.token.valid
事件,并带有授权用户。
Event::listen('auth.token.valid', function($user)
{
//Token is valid, set the user on auth system.
Auth::setUser($user);
});
AuthTokenController::store 在返回响应之前会触发 auth.token.created
事件。
Event::listen('auth.token.created', function($user, $token)
{
$user->load('relation1', 'relation2');
});
AuthTokenController::destroy 在返回响应之前会触发 auth.token.deleted
事件。
处理 NotAuthorizedException
可选地注册 NotAuthorizedException
作为别名,例如 AuthTokenNotAuthorizedException
App::error(function(AuthTokenNotAuthorizedException $exception) {
if(Request::ajax()) {
return Response::json(array('error' => $exception->getMessage()), $exception->getCode());
}
…Handle non ajax response…
});
结合 Laravel Auth 和 AuthToken
一些应用程序可能已经使用了基于传统Laravel的认证。以下可以用来手动生成令牌。
if(Auth::check()) {
$authToken = AuthToken::create(Auth::user());
$publicToken = AuthToken::publicToken($authToken);
}
AuthToken::publicToken
方法准备将认证令牌发送到浏览器。
变更
dev-master
- 添加了令牌过期参数,令牌仅在一个特定时间段内有效。
- 添加了用户代理支持,一个令牌现在与一个用户和一个用户代理相关联。每个设备可以为同一用户拥有自己的令牌。
0.3.0
- 添加了
auth.token.created
事件,该事件在 AuthTokenController::store 返回响应之前触发。 - AuthTokenController 需要将事件分派器传递给构造函数。
0.2.0
- 添加了对 Laravel 4.1.X 的支持。这是一个硬依赖,因为 L4.1 中的 API 发生了变化。
- 移除了 AuthTokenController 的外观,必须使用完整的命名空间到控制器。参见控制器部分
- Auth::attempt字段的可选配置。
小技巧:使用jQuery
使用jQuery的ajaxPrefilter方法,可以在ajax请求上自动设置X-Auth-Token。
// Register ajax prefilter. If app config contains auth_token will automatically set header,
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
if (config.auth_token) {
jqXHR.setRequestHeader('X-Auth-Token', config.auth_token);
}
});
如果收到401响应代码,也可以自动处理。在以下示例中,我选择重定向到注销页面以确保用户会话被销毁。
// If a 401 http error is recieved, automatically redirect to logout page.
$(document).ajaxError(function (event, jqxhr) {
if (jqxhr && jqxhr.status === 401) {
window.location = '/logout';
}
});
小技巧:自动将令牌数据绑定到视图。
可以使用视图作曲家自动将数据绑定到视图。这可以将所有逻辑集中在一个地方。我使用以下内容设置javascript的配置变量。
View::composer('layouts.default', function($view)
{
$rootUrl = rtrim(URL::route('home'), '/');
$jsConfig = isset($view->jsConfig) ? $view->jsConfig : array();
$jsConfig = array_merge(array(
'rootUrl' => $rootUrl
), $jsConfig);
if(Auth::check()) {
$authToken = AuthToken::create(Auth::user());
$publicToken = AuthToken::publicToken($authToken);
$userData = array_merge(
Auth::user()->toArray(),
array('auth_token' => $publicToken)
);
$jsConfig['userData'] = $userData;
}
$view->with('jsConfig', $jsConfig);
});