Laravel使用JWT实现API用户授权

第一部分 安装JWT

第一步. 使用Composer安装 tymon/jwt-auth :`composer require tymon/jwt-auth 1.0.0-rc.3

第二步. 添加服务提供商(Laravel5.4及以下版本,5.5及以上版本无需添加),将下面这行添加至 config/app.php 文件 providers 数组中:

<?php
// 文件:app.php
‘providers’ => [
// other code
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
]

第三步. 发布配置文件,运行如下命令发布 jwt-auth 的配置文件: php artisan vendor:publish –provider=”Tymon\JWTAuth\Providers\LaravelServiceProvider”

第四步. 生成密钥,此命令会在你的 .env 文件中新增一行 JWT_SECRET=secret。 php artisan jwt:secret

第二部分 开始配置

第五步. 配置 Auth guard,`在 config/auth.php 文件中,你需要将 guards/driver 更新为 jwt, 只有在使用 Laravel 5.2 及以上版本的情况下才能使用。

<?php
‘defaults’ => [
‘guard’ => ‘api’,
‘passwords’ => ‘users’,
],
// other code
‘guards’ => [
‘api’ => [
‘driver’ => ‘jwt’,
‘provider’ => ‘users’,
],
],

第六步. 更改 User Model,在User Model上实现TymonJWTAuthContractsJWTSubject接口, 实现getJWTIdentifier() and getJWTCustomClaims()两个方法。

<?php
namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Authenticatable implements JWTSubject
{
// other code

// Rest omitted for brevity

/**
* Get the identifier that will be stored in the subject claim of the JWT.
*
* @return mixed
*/
public function getJWTIdentifier()
{
return $this->getKey();
}

/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [];
}
}
第三部分 快速创建DEMO测试
第七步. 添加一些基本身份验证路由:
<?php
Route::group([
‘middleware’ => ‘api’,
‘prefix’ => ‘auth’
], function ($router) {
Route::post(‘login’, ‘AuthController@login’);
Route::post(‘register’, ‘AuthController@register’);
Route::post(‘logout’, ‘AuthController@logout’);
Route::post(‘refresh’, ‘AuthController@refresh’);
Route::post(‘me’, ‘AuthController@me’);
});
第八步. 创建AuthController控制器 => php artisan make:controller AuthController:
<?php
namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
/**
* Create a new AuthController instance.
*
* @return void
*/
public function __construct()
{
$this->middleware(‘auth:api’, [‘except’ => [‘login’, ‘register’]]);
}

/**
* 用户使用邮箱密码获取JWT Token.
*
* @return \Illuminate\Http\JsonResponse
*/
public function login()
{
$credentials = request([’email’, ‘password’]);

if (! $token = auth()->attempt($credentials)) {
return response()->json([‘error’ => ‘Unauthorized’], 401);
}

return $this->respondWithToken($token);
}

/**
* 注册新用户
*/
public function register(Request $request)
{
// 数据校验
// 数据验证
$validator = Validator::make($request->all(), [
‘name’ => ‘required’,
’email’ => ‘required|email’,
‘password’ => ‘required’,
‘c_password’ => ‘required|same:password’
]);

if ($validator->fails()) {
return response()->json([‘error’=>$validator->errors()], 401);
}

// 读取参数并保存数据
$input = $request->all();
$input[‘password’] = bcrypt($input[‘password’]);
$user = User::create($input);

// 创建Token并返回
return $user;
}

/**
* 获取经过身份验证的用户.
*
* @return \Illuminate\Http\JsonResponse
*/
public function me()
{
return response()->json(auth()->user());
}

/**
* 刷新Token.
*
* @return \Illuminate\Http\JsonResponse
*/
public function refresh()
{
return $this->respondWithToken(auth()->refresh());
}

/**
* Get the token array structure.
*
* @param string $token
*
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
{
return response()->json([
‘access_token’ => $token,
‘token_type’ => ‘bearer’,
‘expires_in’ => auth()->factory()->getTTL() * 60
]);
}
}

第九步. 使用Postman测试API:

测试API数据获取,需要在headers中添加Token; 格式key=Authorization,value=Bearer空格tokenToken刷新:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理