Laravel Passport快速实现API认证

Laravel Passport快速实现API认证

安装拓展 passport

首先为什么要使用passport 拓展?
思考:API 认证如果是网页端使用session 会话保持就可以简单做到,但是如果是app端无会话保持的情况下,就只能想其他办法了,其中一个就是:api 令牌。
如何解决这个问题呢?
思考:用户通过 API 登录时,会生成令牌并将其发送给用户,该用户可用于身份验证,也就是app端提交请求时,头信息里必须添加api token, 如下:$accessToken 为用户登录后生成的令牌

‘headers’ => [
‘Accept’ => ‘application/json’,
‘Authorization’ => 'Bearer '. $accessToken,
]

思路明确后,撸起袖子就干。

  • 前提是你已经创建了laravel 项目;

安装passport 拓展:

composer require laravel/passport

愉快的等待中…

passport 拓展配置

添加服务提供者

现在我们需要在 config/app.php 文件中为Passport注册服务,添加如下:

'providers' => [
    ....
    Laravel\Passport\PassportServiceProvider::class,
]

执行数据迁移

php artisan migrate

安装拓展

php artisan passport:install

添加用户表API TOKEN 支持

修改我们的用户模型代码

use Laravel\Passport\HasApiTokens;

/**
 * Class Administrator.
 *
 * @property Role[] $roles
 */
class Administrator extends Model implements AuthenticatableContract
{
    use Authenticatable;
    use HasPermissions;
    use DefaultDatetimeFormat;
    use HasApiTokens;	// 添加这行代码

以上是我的部分代码(我的是使用了laravel-admin 的用户表,你的可能是这样):

<?php
namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

配置auth service 提供者支持passport 路由

在我们的 AuthServiceProvider 的引导方法中添加 Passport :: routes() 方法。 用来生成必要的路由。 下面是 app/Providers/AuthServiceProvider.php 改完后的部分代码:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        // 'App\Models\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
    }
}

修改api 认证驱动

在 config/auth.php 中找到如下代码,并修改为:

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',	// 修改驱动为passport
            'provider' => 'users'
        ],
    ],

代码实现

添加登录验证控制器

下面就要开始实现登录验证接口了,

php artisan make:controller PassportController

然后代码实现如下:

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PassportController extends Controller
{
    /**
     * Handles Login Request
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(Request $request)
    {
        $credentials = [
            'username' => $request->username,
            'password' => $request->password
        ];

        if (auth()->attempt($credentials)) {
        	// 生成用户访问令牌,'AsYouLike'是你自己定义的字符串
            $token = auth()->user()->createToken('AsYouLike')->accessToken;
            // 获取用户的所有权限
            $permissions = auth()->user()->permissions;
            // 把token 返回给客户端
            return response()->json(['code' => 200, 'token' => $token, 'permissions' => $permissions], 200);
        } else {
            return response()->json(['error' => 'UnAuthorised'], 401);
        }
    }
}

代码应该都看得懂,关键地方已经加注释

添加登录认证路由

在routes/api.php 中添加相关路由:

// 不需要登录接口
Route::group([
    'prefix'        => '/v1',
    'namespace'     => '\App\Http\Controllers',
    'middleware'    => 'api'
], function (\Illuminate\Routing\Router $router) {
	// 登录接口路由
    $router->post('/user/login', 'PassportController@login');
});

// 需要登录后的接口
Route::group([
    'prefix'        => '/v1',
    'namespace'     => '\App\Http\Controllers\Api',
    'middleware'    => 'auth:api'
], function (\Illuminate\Routing\Router $router) {
    $router->resource('hotels', HotelController::class);
});

测试结果

登录验证接口测试

登录成功后,收到token

需要登录才能访问的接口测试

  1. 不提交token 信息或者错误信息时,提示无权限
    没有提交token信息

  2. 正确提交token后,成功查询
    正确提交token
    那么如此就轻松搞定了api token 验证了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

菜鸟没翅膀

你的打赏是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值