Laravel Sanctum authentication
caution
Tài liệu này chỉ dành cho Laravel users sử dụng webhook authentication.
Laravel Sanctum là một authentication system tuyệt vời và được cài đặt sẵn ở các kickstarter template của Laravel, tài liệu này sẽ hướng dẫn bạn dùng Sanctum để làm authentication system cho Hasura.
Mobile app authentication
info
Nếu như project của bạn sử dụng Laravel app, template đã setup mọi thứ giúp bạn, bạn không cần làm theo các bước bên dưới mà chỉ nên đọc để hiểu cơ chế hoạt động của nó như thế nào.
Cấu hình auth
Bạn cần thiết lập defaults.guard
trong config/auth.php
là sanctum
:
'defaults' => [
'guard' => 'sanctum',
],
Trong trường hợp project của bạn có multi guards và defaults.guard
không thể là sanctum
thì bạn hãy thêm nó vào auth.guard
trong file config/hasura.php
:
'auth' => [
'guard' => ['sanctum'],
]
info
Nếu sanctum
không phải là defaults.guard
thì khi bạn sử dụng hàm auth()
cần explicit guard là sanctum
:
auth('sanctum')->user();
Thêm login mutation
Bạn cần thêm GraphQL login mutation để user có thể đăng nhập lấy token sử dụng cho các phiên sau, chúng ta sẽ sử dụng remote schema để thêm login mutation.
Ví dụ login mutation resolver:
<?php
namespace App\Http\GraphQL\LoginMutation;
use App\Models\User;
use Hasura\GraphQLiteBridge\Attribute\Roles;
use Hasura\Laravel\GraphQLite\Attribute\ArgModel;
use Illuminate\Support\Facades\Hash;
use TheCodingMachine\GraphQLite\Annotations as GQL;
use TheCodingMachine\GraphQLite\Exceptions\GraphQLException;
use TheCodingMachine\GraphQLite\Laravel\Annotations\Validate;
class Resolver
{
#[GQL\Mutation(name: 'login')]
#[ArgModel(for: 'user', argName: 'email', fieldName: 'email', inputType: 'String!')]
#[Roles('anonymous')]
public function __invoke(
User $user,
#[Validate(['rule' => 'required'])] string $password,
#[Validate(['rule' => 'required'])] string $device
): Output {
if (!Hash::check($password, $user->getAuthPassword())) {
throw new GraphQLException('Invalid credentials', category: 'InvalidCredentials');
}
$output = new Output();
$output->token = $user->createToken($device)->plainTextToken;
return $output;
}
}
Và Output
type class:
<?php
namespace App\Http\GraphQL\LoginMutation;
use TheCodingMachine\GraphQLite\Annotations as GQL;
#[GQL\Type(name: 'login_output', default: true)]
class Output
{
#[GQL\Field]
public string $token;
}
Sau khi thêm bạn hãy persist application state và hãy thử đăng nhập với kết quả mong đợi sẽ là: