bytesflipper/laravel-auth-token

该软件包的最新版本(dev-master)没有可用的许可信息。

dev-master 2013-07-08 10:49 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:49:32 UTC


README

集成到laravel认证模块,并在成功时提供认证令牌。此令牌仅在https环境中真正安全。此模块的主要目的是为javascript web应用提供认证令牌,该令牌可用于在API调用中识别用户。

Build Status

入门指南

设置

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

'Tappleby\AuthToken\AuthTokenServiceProvider',

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

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

控制器

提供了默认控制器来授权、检查和吊销令牌。将以下内容添加到 app/routes.php

Route::get('auth', 'AuthTokenController@index');
Route::post('auth', 'AuthTokenController@store');
Route::delete('auth', 'AuthTokenController@destroy');
GET 索引操作

以json格式返回当前用户。需要存在 X-Auth-Token 标头。失败时抛出 NotAuthorizedException

POST 存储操作

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

DELETE 销毁操作

清除用户的令牌。需要存在 X-Auth-Token 标头。失败时抛出 NotAuthorizedException

NotAuthorizedException 默认有 401 错误代码。

路由过滤器

服务提供者会注册一个 auth.token 路由过滤器。为了保护资源,只需注册一个before过滤器。如果 X-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);
}); 

处理 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 方法准备将认证令牌发送到浏览器。

技巧:使用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);
});