目录
1、安装jwt-auth
composer require tymon/jwt-auth
2、发布生成配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
3、生成密钥
php artisan jwt:secret
4、config/auth.php中配置guard
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
'hash' => false,
],
],
5、更改Model文件,实现JWTSubject接口
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Fortify\TwoFactorAuthenticatable;
use Laravel\Jetstream\HasProfilePhoto;
use Laravel\Sanctum\HasApiTokens;
use Tymon\JWTAuth\Contracts\JWTSubject;
/**
* Class User
* @mixin \Eloquent
* @package App\Models
*/
class User extends Authenticatable implements JWTSubject
{
use HasApiTokens;
use HasFactory;
use HasProfilePhoto;
use Notifiable;
use TwoFactorAuthenticatable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
'two_factor_recovery_codes',
'two_factor_secret',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = [
'profile_photo_url',
];
/**
* 获取会储存到 jwt 声明中的标识
* @return mixed
*/
public function getJWTIdentifier()
{
return $this->getKey();
}
/**
* 返回包含要添加到 jwt 声明中的自定义键值对数组
* @return array
*/
public function getJWTCustomClaims()
{
return ['role' => 'user'];
}
}
6、创建控制器AuthController.php
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use Hash;
use JWTAuth;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AuthController extends Controller
{
public function __construct()
{
$this->middleware(['jwt.role:user', 'auth:api'], ['except' => ['login', 'register']]);
}
/**
* 用户注册
* @param Request $request
* @return mixed
*/
public function register(Request $request, JWTAuth $auth)
{
$credentials = [
'email' => $request->email,
'password' => Hash::make($request->password)
];
$user = User::create($credentials);
if ($user) {
$token = JWTAuth::fromUser($user);
return $this->responseWithToken($token);
}
}
/**
* 用户登录
* @return JsonResponse
*/
public function login()
{
$credentials = request(['email', 'password']);
if (!$token = auth('api')->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->responseWithToken($token);
}
/**
* 用户信息
* @return JsonResponse
*/
public function me()
{
return response()->json(auth('api')->user());
}
/**
* 登录注销
* @return JsonResponse
*/
public function logout()
{
auth('api')->logout();
return response()->json(['message' => 'Successfully logged out']);
}
/**
* 刷新token
* @return JsonResponse
*/
public function refresh()
{
return $this->responseWithToken(auth('api')->refresh());
}
/**
* 响应
* @param $token
* @return JsonResponse
*/
protected function responseWithToken($token)
{
$response = [
'access_token' => $token,
'token_type' => 'Bearer',
'expires_in' => auth('api')->factory()->getTTL() * 60
];
return response()->json($response);
}
}
7、router/api.php中创建路由
Route::prefix('user')->namespace('Api')->group(function () {
Route::get('register', 'AuthController@register');
Route::post('login', 'AuthController@login');
Route::get('logout', 'AuthController@logout');
Route::get('refresh', 'AuthController@refresh');
Route::get('me', 'AuthController@me');
});
最新回复