iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
1

前情提要:

  • 先確認 User Model跟 table 是否已經設定完畢。
  • 使用 Auth::attempt 這方法前要先確認password有沒有hash加密
  • 以下作法為寫入隨機亂碼當作token、設定token時效後,再寫入資料庫的驗證token方式。非其他驗證機制(Passport、JWT)

以下實作 手動認證 user 的方式逐步說明

事前準備

官方文件的Authentication章節,有提到 Laravel 內建使用者驗證的服務,但得先確認有沒有安裝 laravel/ui 這套件

composer require laravel/ui

後續若如果使用 php artisan ui vue --auth
甚至會提醒提醒npm有無安裝。

登入驗證:使用 Auth::attempt()

public function loginAPI(Request $request)
{
    $credentials = $request->only('email', 'password');

	//先確認user資訊是否正確
    if (Auth::attempt($credentials)) {
        do {
            //建立隨機亂碼
            $loginToken = Str::random(60);
            $checkTokenExist = User::where('remember_token', '=', $loginToken)->first();
        } while ($checkTokenExist);
            //建立token並寫入使用時間
            $user = User::where('email', '=', $request->email)->first();
            $user->remember_token =  $loginToken;
            $user->token_expire_time = date('Y/m/d H:i:s', time() + 10 * 60);
            $user->save();
            $response = array("token" => $user->remember_token, "expire_time" => $user->token_expire_time);
            $httpstatus = 200;

    } else {
      //user not exist or input infomation error
        $response = "login error";
        $httpstatus = 400;
        }
    return response()->json(['message' => $response], $httpstatus);
}

https://ithelp.ithome.com.tw/upload/images/20200927/2012526343626cd1A8.png

取得使用者資訊

方法 1 : 透過 token 去取得 用戶資訊

public function userInfo(Request $request)
{
    $inputToken = $request->remember_token;
    if ($inputToken !== null & $inputToken !== "") {
        $userA = User::where('remember_token', '=', $inputToken)->first();
        if ($userA ){
            return $userA ;
        }
     }
}

方法2 透過 AuthServiceProvider

AuthServiceProvider

public function boot()
{
    $this->registerPolicies();
   
    Auth::viaRequest('token', function ($request) {  
        $user = User::where('remember_token', $request->remember_token)->first();                
        return $user;
}

controller部分只需要這樣寫

public function userInfo(Request $request)
{
    //寫法1
    return $request->user();
    //寫法2
    return Auth::user();
}

成果

https://ithelp.ithome.com.tw/upload/images/20200927/201252635cl7iRwjLR.png

雖然在db欄位中有以下欄位
https://ithelp.ithome.com.tw/upload/images/20200927/20125263pQJiBOKCwE.png

但透過 Model 中的 hidden 去隱藏以下資訊

protected $hidden = [        'password','remember_token','email_verified_at','updated_at','deleted_at'
];

Eloquent ORM 只會提供 postman 截圖的response欄位。


參考資料
https://laravel.com/docs/7.x/authentication
https://ithelp.ithome.com.tw/articles/10229123
https://learnku.com/docs/laravel/7.x/authentication/7474
https://dev.to/msamgan/php-artisan-make-auth-in-laravel-6-0-hc
https://kirin.idv.tw/laravel-user-authentication-basic-step/


上一篇
Eloquent ORM 實作(1):以註冊為例
下一篇
Validation 驗證機制
系列文
30天開發與部署 Laravel 專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言