iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
1
Software Development

後端新手 使用laravel 從零開始 到開出api系列 第 20

Day20 laravel 製作使用者登入api

Day20 laravel 製作使用者登入api

之前的文章中,已經講過Eloquent語法的CRUD以及製作api,其實到了這一步,應該已經能做出Todolist的api的吧,應該吧?
不過現在的Todolist還只有骨架,現在我們要進一步延伸,將這骨架套上登入機制,讓你的專案能夠判斷使用者。

製作登入功能可以說是後端必經之路,這功能必須有一個完好的機制,才不會造成駭客有漏洞可鑽。使用者登入後,後端必須記住使用者已經登入了,以前使用PHP寫登入功能時,都是使用session記住登入者狀態,現在這篇文章要使用token來驗證使用者

token的機制是這樣的:

  1. client端使用登入的api,輸入帳密登入
  2. 登入後拿到一組亂數的token
  3. 拿到token後,要打其他的api都必須在request帶上token這個參數(token要帶在body或是header中都可以,範例中是設定帶在header中)

token會紀錄再db中的users表,每次要使用api都會在middleware確認request的token是否跟db中的token一致,以這樣的機制達到記住使用者登入狀態的功能。

Controller內容

以下是我Todolist專案的原始碼:

    public function login(Request $request)
    {
        $password = $request->password;
        $email = $request->email;
        $dbUser = Users::where('email', $email)->first();

        #判斷帳號是否存在
        if (!$dbUser) {
            return response()->json(['status' => false, 'error' => 'email or password false'], 400);
        }
        
        #判斷密碼是否正確、給亂數token        
        $dbPassword = $dbUser->password;
        if (password_verify($password, $dbPassword)) {
            #避免token重複
            do {
                $token = Str::random(15);
                $tokenCheck = Users::where('remember_token', $token)->first();
                if (isset($tokenCheck)) {
                    $sameToken = true;
                } else {
                    $sameToken = false;
                }
            } while ($sameToken);

            $dbUser->update(['remember_token' => $token]);
            return response()->json(['status' => true, 'login_data' => ['userToken' => $token]], 200);
        } else {
            return response()->json(['status' => false, 'error' => 'email or password false'], 400);
        }
    }

說明:

  • 3~4
    從request中取出email和password
  • 5~10
    使用email在db中尋找該user的data,若是沒找到就回傳錯誤400
  • 13~14
    從db中取出密碼,跟request中的密碼比對,比對失敗回傳錯誤400
    (在註冊時,db中我使用hash加密過的密碼,password_verify()可以比對加密過的亂碼和request中送來的明碼)
  • 16~24
    產生15字元亂數token,使用do,while回圈,避免有重複的token出現
  • 26~27
    將亂數token存入db中,回傳成功200

以上是我的登入方法,在這邊公開自己的code有點不好意思,若是有高手看到還請不吝賜教。laravel自己其實有一套登入功能可以用,但是我認為若要客制化登入系統,還是自己寫的東西方便,以上是我個人的想法,今天就講到這邊啦,Bye!


上一篇
Day19 撰寫api文件
下一篇
Day21 laravel 製作使用者登入api 註冊篇
系列文
後端新手 使用laravel 從零開始 到開出api30

尚未有邦友留言

立即登入留言