GraphQL(lighthouse)+jwt인증 in laravel6

개요



laravel6에서의 동작 확인을 각각하면서 GraphQL로 jwt 인증을 구현해 보았습니다.
비망록.

환경


  • laravel 6.3.0
  • lighthouse 4.5
  • jwt-auth

  • 설치



    lighthouse


    composer require nuwave/lighthouse
    

    laravel-graphql-playground



    개발에 편리한 playground도 넣을 수 있다
    composer require mll-lab/laravel-graphql-playground
    

    jwt-auth


    composer require tymon/jwt-auth ^1.0.0
    
    ^1.0.0 그렇지 않으면 들어주지 않는다.
    문서 필요 체크

    넣은 결과



    composer.json
        "mll-lab/laravel-graphql-playground": "^1.1",
        "nuwave/lighthouse": "^4.5",
        "tymon/jwt-auth": "^1.0.0"
    

    lighthouse 및 graphql-playground의 초기 설정



    lighthouse



    참조 : htps : // / gh 쇼세 php. 이 m/4.5/갓찐 g-s r d/in s 탓치온. HTML
  • 설정 파일 만들기
  • # providerの場所が古いバージョンとは変わっているので注意 ドキュメントを参考に
    # config/lighthouse.php
    php artisan vendor:publish --provider="Nuwave\Lighthouse\LighthouseServiceProvider"
    

    laravel-graphql-playground


  • 설정 파일과 view 만들기
  • # config/graphql-playground.php
    php artisan vendor:publish --provider="MLL\GraphQLPlayground\GraphQLPlaygroundServiceProvider"
    
    /graphql-playground에 액세스하면 실행 화면이 표시됩니다.


    jwt-auth의 초기 설정


  • 설정 파일
  • # config/jwt.php
    php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
    
  • 개인 키 만들기
  • # .envに追加される
    php artisan jwt:secret
    

    jwt-auth로 인증하는 Model 만들기



    API 인증에서 jwt를 사용하기 위해 JWTSubject를 인증하는 모델에 구현한다.
    이번에는 기본 User 모델을 인증에 사용한다.
    implements하여 getJWTIdentifiergetJWTCustomClaims의 두 가지 방법을 정의
    <?php
    
    namespace App;
    
    // ~略~
    use Tymon\JWTAuth\Contracts\JWTSubject;
    
    class User extends Authenticatable implements JWTSubject
    {
       // ~略~
    
        // add
        public function getJWTIdentifier()
        {
            return $this->getKey();
        }
    
        // add
        public function getJWTCustomClaims()
        {
            return [];
        }
    
    }
    
  • getJWTIdentifierjwt 토큰 얻기
  • getJWTCustomClaimsjwt 토큰에 Claim (정보)을 추가하려면 여기에 추가하십시오
  • // 例
    public function getJWTCustomClaims()
    {
        return [
            'email' => $this->email
        ];
    }
    

    config/auth.php 수정



    Guard 설정 변경
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'jwt', // add
            'provider' => 'users',
            // 'hash' => false, つかわない
        ],
    ],
    

    로그인할 쿼리 만들기


    php artisan lighthouse:query Login
    
    app/GraphQL/Queries 에 작성됩니다.

    인증 로직은 시원하게 이런 느낌으로 해 보았습니다.$args 에 파라미터가 들어옵니다.
    성공하면 access_token을 반환합니다.
    <?php
    
    namespace App\GraphQL\Queries;
    
    use GraphQL\Type\Definition\ResolveInfo;
    use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
    
    class Login
    {
        public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
        {
            if (!$token = auth('api')->attempt(['email' => $args['email'], 'password' => $args['password']])) {
                return ['error' => 'Unauthorized'];
            }
            return ['access_token' => $token];
        }
    }
    
    

    schema로 정의


    graphql/schema.graphql에 기술한다.
    기본적으로 여러가지 쓰여져 있습니다만, 그것은 두고 다음과 같이 정의해 본다.@middleware 지시어로 미들웨어를 정의할 수 있다.
    로그인이므로 guest:api 미들웨어를 적용.
    type Query {
        login(email: String! password: String!): LoginData @middleware(checks: ["guest:api"])
    }
    
    # 返ってくるデータのスキーマ
    type LoginData {
        access_token: String
        error: String
    }
    

    로그인



    쿼리를 두드리는


    /graphql-playground
    {
      login(email: "[email protected]" password: "password") {
        access_token
        error
      }
    }
    

    실행

    결과



    성공
    {
      "data": {
        "login": {
          "access_token": "ここにトークン",
          "error": null
        }
      }
    }
    

    실패
    {
      "data": {
        "login": {
          "access_token": null,
          "error": "Unauthorized"
        }
      }
    }
    

    권한 부여 경로 설정


    @middleware 지시문을 사용하여 auth:api 경로 정의
    type Query {
        login(email: String! password: String!): LoginData @middleware(checks: ["guest:api"])
        users: [User!]! @all @middleware(checks: ["auth:api"])
    }
    

    HTTP HEADERS로 액세스 토큰 전달
    {
        "Authorization": "Bearer アクセストークン"
    }
    

    결과



    schema.graphql 를 변경하면 두드린다
    php artisan lighthouse:clear-cache
    

    좋은 웹페이지 즐겨찾기