질문을 삭제하지 말아주세요.!
 
1
0
-1

안녕하세요.

JWT 골치아픈놈이네요.


라라벨 5.5 + tymon JWT 1.* 을 해보니..

JWTAuth 클래스나 라라벨에 내장된 Auth 클래스나 똑같이 동작하네요.


JWTAuth 또는 Auth의 attempt 함수를 봤을 때...

------------------------------------------------------------------------

라라벨 문서:

Auth::attempt([`인증할 값`], `리멤버`);


유저들에 의해 작성된 JWT 문서(아직 만들어지지 않았기때문):

JWTAuth::attempt([`인증할 값`], [`클레임 옵션`]);

------------------------------------------------------------------------


요렇게 되어있더라구요.


유저들이 작성한 JWT의 클레임 옵션 넣는 방법이... 뭐 그렇게 오래된 것도 아니고 어쨌거나 라라벨 5.0 이후에 작성된 글인데... 왜 클레임 옵션이 안먹을까요... 제 코드의 일부는 아래와 같습니다..


------------------------------------------------------------------------

if ($token = $this->guard()->attempt($input, [

  'exp' => Carbon::now()->addDays(7)->timestamp

])) {

  $this→clearLoginAttempts($request);

  $url = $request->session()→get('url');

  return response()->json(compact('url'), 200)->cookie('token', $token, 10080);

}

------------------------------------------------------------------------


정상적으로 토큰이 발급되나, exp 값을 조회해보면 config/jwt.php에 설정된 ttl 값만 참조해서 발급됩니다..



Q. config/jwt.php 의 ttl 값을 무시하고, 토큰을 발급할 때 소멸시간을 설정할 수 있는 방법이 무엇일까요??

    CommentAdd your comment...

    3 answers

    1.  
      2
      1
      0

      안녕하세요 김주원님, 또 다시 답변 감사합니다!!


      다른분께 설명해주실 때 도움이 되드리라고 몇자 적어봅니다.


      `tymon jwt 1.0.0-rc.1`에서는 `laravel 5.5`에 맞게 작업을 진행하는 것으로 보입니다.


      따라서 이제 라라벨 토큰 인증 방식과 마찬가지로 사용하면 되겠습니다.


      use Illuminate\Foundation\Auth\AuthenticatesUsers;


      인증:

      $this->guard()->attempt();


      커스텀클레임 설정:

      $this->guard()->customClaims();

        CommentAdd your comment...
      1.  
        3
        2
        1

        tymon/jwt-auth 어떤 버전을 쓰시는 지 모르겠습니다. 제가 쓰는 버전 1.0.0-rc.1에서는 JWTAuth::attempt(array $credentials)와 같습니다. https://github.com/tymondesigns/jwt-auth/blob/develop/src/JWTAuth.php#L48-L55

        유스케이스를 정확히 이해하진 못했습니다. 콜스택을 계속 따라 들어가면서 살펴봤는데요, tymon/jwt-auth 패키지로는 질문하신 내용은 불가해 보입니다. 일말의 실마리라면 JWT를 생성하는 함수에 주입되는 객체를 직접 구현한 녀석으로 라라벨 서비스 프로바이더에서 교체해서 주입하는 방법일텐데, 얻는 것 대비 에너지 소비가 크다고 생각됩니다. 필요한 요구사항을 충족하는 다른 패키지를 찾아보시는게 좋겠습니다.

        혹시라도 해결 방법을 찾거나, 더 나은 패키지를 찾으면 공유 부탁드립니다.

        1. 김주원

          한 가지 생각이 떠 올랐는데요.
          구현을 변경하기 힘들면, 구현이 사용하는 데이터('ttl' => env('JWT_TTL', 60))를 변경하는 방법을 생각해 볼 수 있겠네요. 해당 데이터를 사용하는 코드는 아래 위치입니다.
          https://github.com/tymondesigns/jwt-auth/blob/develop/src/Providers/AbstractServiceProvider.php#L275-L283

          -----

          그리고, 제가 알고 있기론 커스텀 클레임은 JWT 스펙(RFC7519)에서 mandatory/optional로 정의하지 않은 사용자가 추가하는 별도의 클레임인데요. 예제는 아래 링크를 참고해주세요.
          https://github.com/appkr/db-lock-poc/blob/master/core/Myshop/Domain/Model/User.php#L107-L116

        CommentAdd your comment...
      2.  
        2
        1
        0

        제가 질문의 의도를 잘 이해한지는 모르겠지만..

        $payload = JWTFactory::make(['exp'=> $expiry, 'isPayToken' => 'true']);
        return JWTAuth::encode($payload);

        JWTFactory 에서 make를 이용하면 exp 를 변경해서 payload를 변경해서 토큰을 생성할 수 있습니다.

        1. 김영우

          답변 감사합니다!

          JWTFactory 클래스는 옵션으로 알고 있습니다만, 해당 클래스를 이용하지 않고, 클레임 값을 설정할 수 있는 방법을 찾아냈습니다.


          자문자답합니다.


          laravel AuthenticatesUsers를 사용합니다.


          $this->guard()->customClaims({array});

        CommentAdd your comment...