[Day12] 第十二章-完成注册API 修改route,controller,model(使用passport认证)

前言

昨天把passport套件安装完
今天试者把model,route,controller设定完

目标

  1. 今天把注册api跑完!!

实作

前置作业做完後
我们要开始改里面的档案了

1.档案配置修正

config/auth.php

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

guard 里面 新版只有web後面补上api并且driver 改成passport
这边是决定我们的api路由认证要使用哪个套件

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(); //补上这行
        
    }
}

这边定义passport的配置

app/models/user.php

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;     //补这行

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable; //补这行

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

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

这边如果是新版的laravel应该会自动帮你补上
但如果没有就自行补上吧!!

2. Request验证器制作

最後我们要验证前端传过来的资讯
这时候就可以使用laravel 的request
详细文件可以参考
laravel request文件
这个功能可以自行自做前端传过来的request资料要做什麽样的验证!!

这边我会自行新增两个request验证
分别是

  1. APIRequest : 这个目的是为了有错误的验证时回传相关错误讯息。
  2. CreateUser: 这个request验证是为了验证我们user signup传过来的资料格式是否正确!

第一个APIrequest
首先先下指令

php artisan make:request APIRequest

接者我们会再
app/http/requests/apirequest.php看到

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;  //可以回传http错误的讯息
use Illuminate\Contracts\Validation\Validator;

class APIRequest extends FormRequest
{
    protected function failedValidation(Validator $validator) { 
        // write your business logic here otherwise it will give same old JSON response
    throw new HttpResponseException(response()->json($validator->errors(), 400)); 
}
}

很方便的函式如果我们使用这个class
可以把http错误讯息丢回去前端

  1. CreateUser.php

接者透过指令建立 CreateUser的验证

php artisan make:request CreateUser
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CreateUser extends APIRequest  //这边要注意
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
            'name' =>'required|string',
            'email' => 'required|string|unique:users',
            'password' => 'required|string|confirmed'

        ];
    }
}

这边要注意的第一点是我们要继承APIRequest来帮助我们如果遇到错误
会直接回传前端
接者在rules里面
我们可以自行定义资料是否符合规范

  • emial : 必填,字串
  • name : 必填, 字串, 独一无二的(透过users对应)
  • password: 必填, 字串, confirmed(这个参数代表前端还需要多传送一个password_confirmation并且验证是否跟password一样)

最後建立authcontroller吧

php artisan make:controller AuthController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\CreateUser; //引入我们建立好的验证器
use App\models\User; //引入user model

class AuthController extends Controller
{
    //
    public function signup(CreateUser $request)
    {
        $validateData = $request->validated();
        $user = new User([
            'name'=> $validateData['name'],
            'email' =>$validateData['email'],
            'password' => bcrypt($validateData['password']),
        ]);
        $user->save();
        return response($user,201);
    }
}

这边我们使用createUser取代Request class来当作验证器
接者如果验证成功的资料
我们再新建一个user 物件 储存置资料库里
bcrypt 可以帮助我们hash密码防止密码明文显示造成资安疑虑

测试

第一次测试我们先故意输入错误的password_confirmation看看吧!!
https://ithelp.ithome.com.tw/upload/images/20210927/20121052MfErJPNofe.png
结果验证器有成功帮我们抓出password不符合
并且有吐回去前端让我们看到错误讯息

接者来打一次正确的资料吧!!

https://ithelp.ithome.com.tw/upload/images/20210927/201210529E8jKA3cSA.png

这样就完成了喔!!

总结

今天总算把昨天的注册部分API完成了
希望大家会喜欢!
/images/emoticon/emoticon02.gif


<<:  [Day 12]我也好想成为时间管理大师(後端篇)

>>:  离职倒数4天:驱动美丽新世界的重要力量就是消费,就是要让人不断想买东西

Day11 职训(机器学习与资料分析工程师培训班): Python程序设计, 建立Model+载入

上午:Python程序设计 早上学习function, *args, *kwargs, 全域变数 &...

[DAY2]k8s在做什麽

先来张时代的眼泪 图片来源(官网资料) 最原始的实体主机一台一台设定环境:纯手工,因为硬体配置都是固...

第28天:箭头函式与this()

在解析this的方式箭头函式与函式宣告不同,函式宣告是以呼叫时的方式来决定,而箭头函式在建立时就会决...

[NestJS 带你飞!] DAY17 - Injection Scopes

Nest 在大多数情况下是采用 单例模式 (Singleton pattern) 来维护各个实例,也...

Day4 Tableview小实作1

首先,我这个的作法跟其他不太一样! 我在原有的storyboard,拉了tableviewcontr...