zoukankan      html  css  js  c++  java
  • Laravel passport认证

    在 API 场景里通常通过令牌来实现用户授权,而非维护请求之间的 Session 状态。

    在 Laravel 项目中使用 Passport 可以轻而易举地实现 API 授权认证,Passport 可以在几分钟之内为你的应用程序提供完整的 OAuth2 服务端实现。


    安装:

    composer require laravel/passport

    批注 2020-04-12 134446

    Passport 服务提供器使用框架注册自己的数据库迁移目录

    因此在注册提供器后,就应该运行 Passport 的迁移命令来自动创建存储客户端和令牌的数据表:

    php artisan migrate

    Passport默认是提供一个全功能的OAuth授权系统,如果不需要,

    1. 首先在php artisan migrate

    执行之前添加一个方法到app/Providers/AppServiceProvider的register()方法中:

    LaravelPassportPassport::ignoreMigrations();
    2.在app/Http/Kernel内的’web’配置里添加:
    'web' => [
        ...
        LaravelPassportHttpMiddlewareCreateFreshApiToken::class,
    ]
    这个会在以后的web请求中,添加一个laravel_token字段到cookie中。
    参考:Consume Laravel APIs from VueJS with Passport


    这里我们暂时采用了默认的:

    接下来,运行 passport:install 命令来创建生成安全访问令牌时所需的加密密钥

    同时,这条命令也会创建用于生成访问令牌的「个人访问」客户端和「密码授权」客户端:

    php artisan passport:install

    批注 2020-04-12 134310

    上面命令执行后,请将 LaravelPassportHasApiTokens Trait 添加到 AppUser 模型中

    这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用范围:

    批注 2020-04-12 134622

    接下来,在 AuthServiceProviderboot 方法中调用 Passport::routes 函数。这个函数会注册发出访问令牌并撤销访问令牌、客户端和个人访问令牌所必需的路由:

    批注 2020-04-12 142114

    最后,将配置文件 config/auth.php 中授权看守器 guards 的 api 的 driver 选项改为 passport。此调整会让你的应用程序在在验证传入的 API 的请求时使用 Passport 的 TokenGuard 来处理:

    批注 2020-04-12 142321


    更多内容:

    https://learnku.com/docs/laravel/7.x/passport/7515

    https://learnku.com/laravel/t/20144


    关于jwt

    Laravel 與 JWT 搭配運用

    【Day 2】Create Laravel Project & Json Web Token

    Laravel 6.0 JWT教學

    Laravel 使用 JWT 实现 API Auth, 打造用户授权接口


    关于Passport运用:

    Laravel 5.7 — API authentification with Laravel Passport

    VueJs Consumer App – Laravel API with Passport

    参考 Laravel 5.7 — API authentification with Laravel Passport 后:

    注意:由于我们在migrate的时候采用了默认的设置,有很多数据表都没有用上,建议以后自定义一下。

    执行

    php artisan make:controller Api/AuthController

    AuthController中我们只对Personal Access Token执行操作,关于Personal Access Token参考:个人访问令牌

    代码如下:

    <?php
    
    namespace AppHttpControllersApi;
    
    use AppHttpControllersController;
    use AppUser;
    use IlluminateHttpRequest;
    use IlluminateSupportFacadesHash;
    use IlluminateSupportFacadesValidator;
    
    class AuthController extends Controller
    {
        //https://medium.com/@martin.riedweg/laravel-5-7-api-authentification-with-laravel-passport-92b909e12528
        public function register(Request $request)
        {
            $validator = Validator::make($request->all(), [
                'name' => 'required|string|max:255',
                'email' => 'required|string|email|max:255|unique:users',
                'password' => 'required|string|min:6|confirmed',
            ]);
    
            if ($validator->fails()) {
                return response([
                    'errors' => $validator->errors()->all()
                ], 422);
            }
    
            $request['password'] = Hash::make($request['password']);
            $user = User::create($request->toArray());
            $token = $user->createToken('Laravel Password Grant Client')->accessToken;
    
            $response = ['token' => $token];
    
            return response($response, 200);
        }
    
        public function login(Request $request)
        {
            $user = User::where('email', $request->email)->first();
    
            if ($user) {
                if (Hash::check($request->password, $user->password)) {
                    $token = $user->createToken('Laravel Password Grant Client')->accessToken;
                    $response = ['token' => $token];
                    return response($response, 200);
                } else {
                    $response = "Password missmatch";
                    return response($response, 422);
                }
            } else {
                $response = "User does not exist";
                return response($response, 422);
            }
        }
    
        public function logout(Request $request)
        {
            $token = $request->user()->token();
            $token->revoke();//disable trash the token
            $response = "You have been successfully logged out!";
    
            return response($response, 200);
        }
    }
    
    
    AuthController.php

    api.php修改如下:


    <?php
    
    use IlluminateHttpRequest;
    use IlluminateSupportFacadesRoute;
    
    /*
    |--------------------------------------------------------------------------
    | API Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register API routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | is assigned the "api" middleware group. Enjoy building your API!
    |
    */
    
    Route::middleware('auth:api')->get('/user', function (Request $request) {
        return $request->user();
    });
    
    Route::middleware('auth:api')->get('/user', function (Request $request) {
        return $request->user();
    });
    
    Route::post('login', 'ApiAuthController@login')->name('login.api');
    Route::post('register', 'ApiAuthController@register')->name('register.api');
    
    Route::middleware('auth:api')->get('logout', 'ApiAuthController@logout')->name('logout.api');
    
    

    通过在PostMan中测试 结果如下:

    注册请求:

    批注 2020-04-13 203409

    将返回的token复制一下 登录请求的Authorization中,选择Bearer Token,将复制的Token粘贴到Token输入框中:

    批注 2020-04-13 203743

    然后在body中键入email 及 password字段及其值,然后发送post请求。

    登录请求:

    批注 2020-04-13 203923

    复制登录成功后response中的token值。

    粘贴到退出登录请求的Bearer Token中:

    批注 2020-04-13 204058

    退出登录请求:

    发送get请求,结果如下:

    批注 2020-04-13 204141

    再来看看数据库中的数据:

    用户表:

    批注 2020-04-13 204344

    access_token表:

    批注 2020-04-13 204604

    因为我们注册时后台返回的token我们只是来进行了登录 ,逻辑上没有将注册返回的token来revoke作废掉,所以user_id为3的用户的token revoked为0【未作废】,但是登录后返回的token我们执行了logout,通过AuthController中logout方法把登录的token作废了,所以表中revoked为1【作废了】。

  • 相关阅读:
    一个简单的php站点配置
    nginx基本配置
    redis命令大全
    while()
    遍历字符串
    带空格的字符串逆转(简洁版)
    Java Swing 介绍
    java键盘输入
    做一个完整的Java Web项目需要掌握的技能
    biu
  • 原文地址:https://www.cnblogs.com/dzkjz/p/12684899.html
Copyright © 2011-2022 走看看