jeckerson/laravel-auth-token

此包的最新版本(1.0.3-beta)没有可用的许可证信息。

1.0.3-beta 2015-11-18 17:07 UTC

README

将挂钩到laravel认证模块并在成功时提供认证令牌。这个令牌仅在https环境中才是安全的。此模块的主要目的是为javascript web应用提供认证令牌,用于在API调用中识别用户。

Build Status

入门

设置

将包添加到您的 composer.json,运行 composer update

"require": {
	...
    "tappleby/laravel-auth-token": "0.4.*"
}

将服务提供者添加到 app/config/app.php

'Tappleby\AuthToken\AuthTokenServiceProvider',

app/config/app.php 中设置可选别名

'AuthToken' => 'Tappleby\Support\Facades\AuthToken',
'AuthTokenNotAuthorizedException' => 'Tappleby\AuthToken\Exceptions\NotAuthorizedException'

当前认证令牌存储在数据库中,您需要运行迁移

php artisan vendor:publish --provider="Tappleby\AuthToken\AuthTokenServiceProvider"
php artisan migrate
可选配置

此包默认使用电子邮件作为用户名字段进行验证,这可以通过包配置进行更改。

  1. 发布配置 php artisan config:publish tappleby/laravel-auth-token
  2. 编辑 app/config/packages/tappleby/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', 'Tappleby\AuthToken\AuthTokenController@index');
Route::post('auth', 'Tappleby\AuthToken\AuthTokenController@store');
Route::delete('auth', 'Tappleby\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 的列表,最好明确定义它们而不是使用通配符 *

请求参数

所有请求必须包含以下之一

  1. X-Auth-Token 标头。
  2. auth_token 字段。
GET 索引操作

以JSON格式返回当前用户。需要提供认证令牌参数。失败时抛出 NotAuthorizedException

POST 存储操作

必需输入 usernamepassword。成功返回包含 tokenuser 的JSON对象。失败时抛出 NotAuthorizedException

DELETE 销毁操作

清除用户的令牌。需要提供认证令牌参数。失败时抛出 NotAuthorizedException

NotAuthorizedException 默认错误代码为 401

路由过滤器

服务提供者注册了 auth.token 路由过滤器。要保护资源,请注册一个before过滤器。如果有效的认证令牌无效或不存在,则过滤器将抛出 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方法准备将认证令牌发送到浏览器。

变更

0.3.0

  • 添加了auth.token.created事件,该事件在AuthTokenController::store返回响应之前触发。
  • AuthTokenController需要将事件调度器传递给构造函数。

0.2.0

  • 增加了对Laravel 4.1.X的支持。这是由于L4.1中的API更改,因此是一个硬依赖。
  • 移除了AuthTokenController的facade,必须使用完整的命名空间到控制器。参见控制器部分
  • 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);
});