박주니 개발 정리

laravel sanctum 로그인 적용 본문

라라벨

laravel sanctum 로그인 적용

박주니 2024. 1. 30. 11:55
728x90
반응형

설명전)

sanctum은 laravel과 긴밀하게 통합되어 있어, Laravel 기반의 프로젝트에서 빠르고 쉽게 구현할 수 있습니다. 

지금 이 설명은 laravel composer 셋팅이 끝나고 프로젝트가 실행될 수 있는 단계에서 적용이 가능하고 1차적으로 회원가입하고 로그인 진행시 id와 password를 match한 이후에 해당 조건이 부합한 이후 token 발행 전까지는 준비가 되어있어야합니다. 

 

1. 현재 laravel 설정한 폴더 위치에서 sanctum을 설치합니다. 

composer require laravel/sanctum

 

2. sanctum을 설치한 파일 위치에서 설정 파일을 발행합니다. 

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

 

3. sanctum에 내장되어있는 personal_access_token model을 migrate 합니다. 

php artisan migrate

 

4. 로그인 controller에서 id, password match이후 로그인 접속전 createToken을 이용해서 token을 생성합니다. 

  • LoginController.php 예시
    public function login(Request $request)
    {
        //유효성 검사
        $validator = Validator::make($request->all(), [
            'id' => 'required|string',
            'password' => 'required|string'
        ]);

        if($validator->fails())
        {
            return $this->sendError('Error validation', $validator->errors());       
        }
        
        $hashed = base64_encode(hash('sha256', $request->password, true));

        $adminId = $request->id;
        for($i = 1;$i<=3; $i++){
            $saveAdmin = NomalAdmin::where('id', $i)->first();
            if(!empty($saveAdmin)){
                $saveAdminId = $saveAdmin->admin_id;
                if($request->id == $saveAdminId){
                    $nomalAdmin = NomalAdmin::where('admin_id', $saveAdminId)->first();
                    if($nomalAdmin->password == $hashed){
                        // createToken() 실행시 personal_access_tokens에 create row
                        $createToken = $nomalAdmin->createToken('nomalAdmin')->plainTextToken; 
                        // 토큰 문자열 분리
                        $splitToken = explode("|", $createToken);
                        $token = $splitToken[1];
                    }

                }
            }
        }

    }

설명)

sanctum 을 통해 personal_access_token table에 data 저장 및 token이 발행되는 위치는 if($nomalAdmin->password === $hashed){} 이후부터입니다. 지금 이전까지 과정은 일차적으로 회원가입에 저장된 정보를 match해서 부합하는 과정입니다. 

 

세부 분석)

$createToken = $nomalAdmin->createToken('nomalAdmin')->plainTextToken;

  • createToken을 사용하게 되면 자동적으로 personal_access_tokens 에 데이터가 추가가 되고 지금 상단에 이미지가 보이는 것처럼 $nomalAdmin과 connect를 진행합니다. personal_access_tokens column을 분석 결과입니다. 
    • tokenable_type: 연결한 로그인 user model 위치
    • tokenable_id: 연결한 로그인 user id 
    • name: createToken('nomalAdmin') 을 넣으면 name에 nomalAdmin이 나오는것처럼 별도 구분하기 위한 name을 넣으면 됨 
    • token: 보안상에 이유로 LoginController.php에 $token 해시된 값을 넣음 (*token 값이 다른 이유는 해시해서 그런거고 나중에 auth:sanctum할 때 자체적으로 token을 hash해서 비교함 

3. createToken에서 token을 split를 합니다. 

                        $splitToken = explode("|", $createToken);
                        $token = $splitToken[1];
                        $response = [
                            'success' => true,
                            'id' => $saveAdminId,
                            'token' => $token,
                            'message' => 'success login',
                        ];
                        return response()->json($response, 200);

 

      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        Accept: "application/json",
        Authorization: `Bearer ${token}`,
      },

설명) 

그럼 현재 response로 내보낸 token은 프론트에서 로그인 이후에 api 이용시 header에 authorization에 Bearer 뒤에 token을 넣으면 token을 검증할 수 있는 준비가 된 상태입니다. 

 

4. routes/api.php에서 로그인 이후에 route를 사용하기 전 middleware auth:sanctum 체크 진행될 수 있게 설정합니다. 

Route::group(['middleware' => ['auth:sanctum']], function(){}

설명)

이렇게 셋팅한것만으로도 authorization으로 보낸 token을 laravel hash로 전환한다음에 match해서 맞을경우 auth group안에 있는 route 사용이 가능해집니다. 

 

 

728x90
반응형
Comments