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

CSDN开发云

一、前言

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

  • session
  • token
  • jwt

本文将要解决以下问题:

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

CSDN开发云

二、版本约定

  • 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只能存在一条
    CSDN开发云

五、推荐使用jwt

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

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

六、总结

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

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

CSDN开发云

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小雨青年

程序员可以把咖啡转化成代码~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值