• Laravel 7 用户认证 Auth —— 2 内置的API认证 (不推荐)


    1 原理

    1.1 注册

    用户注册后,随机生成长字符串作为token,原生的token返回给用户,哈希后的token存到数据库里

    1.2 登录

    用户使用账号密码登录成功,随机生成字符串作为token,原生的token返回给用户,哈希后的token存到数据库里

    1.3 认证

    将用户传来的原生的token经行哈希,然后取数据库中查找哈希后的token,找到了就认证成功,否则失败。

    2 使用

    2.1 users添加api_token字段

     使用迁移添加

    2.2 设置模型可操作api_token字段

    appUser.php

        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'name', 'email', 'password','api_token'
        ];

    2.3 修改配置文件

    configauth.php

    'defaults' => [
            //'guard' => 'web',
            'guard' => 'api',
            'passwords' => 'users',
        ],
    'api' => [
                'driver'    => 'token',
                'provider'  => 'users',
                'hash'      => true,   //用SHA-256算法哈希你的令牌
            ],

    2.4 设置所有请求和响应都是json格式

    php artisan make:request BaseRequest
    

    appHttpRequestsBaseRequest.php

    添加两个方法

        /**
         * @return bool
         * 确定当前请求是否要求JSON。
         */
        public function wantsJson()
        {
            return true;
        }
        
        /**
         * @return bool
         * 确定当前请求是否可能期望JSON响应
         */
        public function expectsJson()
        {
            return true;
        }

    2.5 配置接受和返回json

    publicindex.php

    $response = $kernel->handle(
    //    $request = IlluminateHttpRequest::capture()
        $request = AppHttpRequestsBaseRequest::capture()
    );

    2.6 编写api认证代码

    2.61 路由

    outesapi.php

    Route::post('/register','AuthApiController@register');
    Route::post('/login','AuthApiController@login');
    Route::post('/refresh','AuthApiController@refresh');
    Route::post('/logout','AuthApiController@logout');

    2.62 控制器

    php artisan make:controller AuthApiController
    <?php
    
    namespace AppHttpControllersAuth;
    
    use AppHttpControllersController;
    use IlluminateHttpRequest;
    use AppUser;
    use IlluminateSupportFacadesValidator;
    use IlluminateSupportFacadesAuth;
    use IlluminateSupportStr;
    
    
    use AppTraitsAuthenticatesUsers;
    
    class ApiController extends Controller
    {
        //
        public function __construct()
        {
            $this->middleware('auth')
              ->except('login','register');
        }
        /*
         * 由于我已经在Traits里修改了认证字段 所以这里不需要。
         * https://www.cnblogs.com/polax/p/14656132.html
         * 
        protected function username()
        {
           return 'name';
        }
        */
        use AuthenticatesUsers;
        public function register(Request $request)
        {
           $this->validator($request->all())->validate();
           $api_token = Str::random(80);
           $data = array_merge($request->all(),compact('api_token'));
           $this->create($data);
           return compact('api_token');
        }
        
        protected function validator(array $data)
        {
            return Validator::make($data,[
              'name'=>['required','string','max:255','unique:users'],
              'password'=>['required','string','min:8','confirmed']
            ]);
        }
        protected function create(array $data)
        {
           return User::forceCreate([
             'name'         =>$data['name'],
             //'email'        =>$data['email'],
             'password'     =>password_hash($data['password'],PASSWORD_DEFAULT),
             'api_token'    =>hash('sha256',$data['api_token'])
           ]);
        }
        public function logout()
        {
            Auth::user()->update(['api_token'=>null]);
            return ['message'=>'退出登录成功'];
        }
        
        public function login()
        {
            $user = User::where($this->username(),request($this->username()))
              ->firstOrFail();
            if (!password_verify(request('password'),$user->password)){
                return response()->json(['error'=>'抱歉,账号名或密码错误'],403);
            }
            $api_token = Str::random(80);
            $user->update(['api_token'=>hash('sha256',$api_token)]);
            return compact('api_token');
        }
        public function refresh()
        {
            $api_token = Str::random(80);
            Auth::user()->update(['api_token'=>hash('sha256',$api_token)]);
            return compact('api_token');
        }
    }

    3 测试

    3.1 注册

    3.2 登录

    3.3 刷新token

    传入的token是未哈希过的

    3.4 登出

     

    4 其他认证

    Laravel 7 用户认证 Auth ——传统web认证
    Laravel 7 用户认证 Auth ——Passport密码模式认证
    Laravel 7 用户认证 Auth ——Passport授权码模式认证

  • 相关阅读:
    Nginx proxy开启cache缓存
    Nginx Server 配置
    nginx 全局配置
    Nginx 配置文件解析
    Python-Scrapy框架
    Python-shutil模块
    os模块3
    os模块
    python os模块atime ,ctime,mtime意义
    Python-正则表达式
  • 原文地址:https://www.cnblogs.com/polax/p/14687672.html
Copyright © 2020-2023  润新知