LaravelLaravel的auth认证中间件的Api-token详细配置说明

Posted 小雨青年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LaravelLaravel的auth认证中间件的Api-token详细配置说明相关的知识,希望对你有一定的参考价值。


文章目录

一、前言

用户认证在任何框架内都是很重要的一部分,Laravel为用户认证提供了丰富的实现方式,包括但不仅限于

  • session
  • token
  • jwt

本文将要解决以下问题:

  1. token的认证方式是如何配置的?
  2. api-token有什么不足
  3. 推荐哪个认证方式?

二、版本约定

  • Laravel 5.8
  • php 7.1

三、配置实现api-token

我们实现的token是api-token,最直观描述是,手动设置token值,自动校验token并返回用户表数据。

第一步,配置数据表。对于需要验证的数据表,对应的model要设置继承Authenticatable

use Illuminate\\Foundation\\Auth\\User as Authenticatable;

class User extends Authenticatable

然后,需要在表中增加一列api_token,建议长度64以上。

第二步,修改config/auth.php

Laravel的auth配置可以理解为两层,guards->providers。相关的配置如下。

    'guards' => [

        'api' => [
            'driver' => 'token',
            'provider' => 'user', //这里是下面的provider的名字
            'hash' => false,
        ],
    ],

    'providers' => [

         'user' => [
             'driver' => 'eloquent', //这里指向了model,也可以使用datebase直接指向数据表
             'model' => App\\Models\\User::class,
         ],
    ],

第三步,业务上更新api_token

    public function updateTokenByUid($uid)
        $token = hash('sha256', random_bytes(32)); //随机生成64位字符串
        User::where('id', $uid)->update(['api_token' => $token]);
        return $token;
    

第四步,需要验证的控制器配置中间件。

这里我们需要注意的是,需要指定上面配置的guards的名字是api的auth。

routes/api.php

Route::resource('/profile', 'ProfileController')->middleware('auth:api');

第五步,获取验证的auth数据。

在配置的控制器内,我们可以通过下面的方式拿到验证的身份。

$user = auth('api')->user();

打印结果是对应数据表的model模型,我们就可以根据需要取出对应的用户数据。

api_token的请求方式支持几种,我们可以根据实际业务选择。

$response = $client->request('GET', '/api/user?api_token='.$token); //get

$response = $client->request('POST', '/api/user', [ //post
    'headers' => [
        'Accept' => 'application/json',
    ],
    'form_params' => [
        'api_token' => $token,
    ],
]);

$response = $client->request('POST', '/api/user', [ //header
    'headers' => [
        'Authorization' => 'Bearer '.$token,
        'Accept' => 'application/json',
    ],
]);


有人就要问题,验证不通过怎么处理呢?如果没有通过验证,请求就会经过app/Http/Middleware/Authenticate.php,我们可以直接给出异常返回。

    protected function redirectTo($request)
    
        if(! $request->expectsJson())
            ApiReturn::return([],ErrorCode::FORBIDDEN);
            exit();
        
    

四、api-token的不足

api-token的验证显然是非常简单的,只需要自己管理用户表的api_token字段即可。

简单也是有代价的,显而易见的问题有

  • token的生成方式不受控制,有的开发人员的实现方式太简单会导致token不安全
  • token没有有效时间
  • token只能存在一条

五、推荐使用jwt

为什么推荐jwt作为接口的验证方式呢?有以下几点。

  • jwt可以控制ttl,即token的有效期
  • jwt有严谨的结构,Header.Payload.Signature,更加安全
  • jwt通过算法分发token,不与数据库结构绑定

六、总结

Laravel通过auth中间件的形式处理中间件,我们可以轻松更换认证方式,使其满足业务需求。

对于接口验证,我更推荐使用jwt。

以上是关于LaravelLaravel的auth认证中间件的Api-token详细配置说明的主要内容,如果未能解决你的问题,请参考以下文章

Django:用户认证组件 & 中间件

Django框架进阶7 django请求生命周期流程图, django中间件, csrf跨站请求伪造, auth认证模块

Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码

Laravel 5.3 使用内置的 Auth 组件实现多用户认证功能

Laravel 中间件 API 认证

Lumen HTTP 基本认证