GraphQL(lighthouse)+jwt인증 in laravel6
개요
laravel6에서의 동작 확인을 각각하면서 GraphQL로 jwt 인증을 구현해 보았습니다.
비망록.
환경
설치
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
# 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하여
getJWTIdentifier
및 getJWTCustomClaims
의 두 가지 방법을 정의<?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 [];
}
}
getJWTIdentifier
jwt 토큰 얻기 getJWTCustomClaims
jwt 토큰에 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
Reference
이 문제에 관하여(GraphQL(lighthouse)+jwt인증 in laravel6), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/_mmmm_/items/bf2dd52bc5be18563753텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)