在返回响应之前,大多数 API
需要通过某种形式的身份验证。 有时,经过和未经过身份验证的请求,响应的内容会有所不同。也就是登录之后的用户看到页面和没有登录看到页面是不一样的。
JSON Web Tokens (JWT)
tymon/jwt-auth 是使用第三方来集成 JWT
身份验证的软件包。
Laravel API 认证:JWT 认证 | Laravel China 社区
一旦您安装了这个软件包,您就可以在 config/api.php
文件或者引导文件中配置该服务提供者。
'auth' => [
'jwt' => 'Dingo\Api\Auth\Provider\JWT',
],
安装 jwt-auth
composer require tymon/jwt-auth
发布配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
安装好之后,config文件夹加多一个jwt的配置
生成 JWT_SECRET
你可以通过运行如下命令自动生成 JWT_SECRET
到 .env
中
php artisan jwt:secret
执行之后
更新user模型
然后还需要加入下面代码
// 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 [];
}
配置 Auth guard
DinggoAPI配置
在路由中限制登录需要验证的路由
$api->version('v1', function ($api) {
$api->get('user', ['middleware' => 'api.auth', 'providers' => ['basic', 'oauth'], function () {
// 这个路由将进行身份验证。
}]);
});
一般使用路由分组
<?php
$api = app('Dingo\Api\Routing\Router');
$api->version('v1',['middleware'=>'api.throttle','limit'=>60,'expires'=>1], function ($api) {
//路由组
$api->group(['prefix'=>'auth'],function ($api){
// 用户注册
$api->post('register',[\App\Http\Controllers\Auth\RegisterController::class,'store']);
// 登录的路由
$api->post('login',[\App\Http\Controllers\Auth\LoginController::class,'login']);
// 需要登录之后验证的路由
$api->group(['middleware'=>'api.auth'],function ($api){
// 退出登录
$api->post('logout',[\App\Http\Controllers\Auth\LoginController::class,'logout']);
// 刷新token
$api->post('refresh',[\App\Http\Controllers\Auth\LoginController::class,'refresh']);
});
});
});
做登录生成token
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\BaseController;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use Illuminate\Http\Request;
class LoginController extends BaseController
{
/**
* 登录
*/
public function login(LoginRequest $request)
{
$credentials = request(['username','email', 'password']);
if (!$token = auth('api')->attempt($credentials)) {
return $this->response->errorUnauthorized();
}
// 检测用户状态
$user = auth('api')->user();
if($user->is_locked == 1){
return $this->response->errorForbidden('被锁定');
}
return $this->respondWithToken($token);
}
/**
* Get the authenticated User.
*
* @return \Illuminate\Http\JsonResponse
*/
public function me()
{
return response()->json(auth('api')->user());
}
/**
* 退出登录
*/
public function logout()
{
auth('api')->logout();
return $this->response->noContent();
}
/**
* 刷新token
*/
public function refresh()
{
return $this->respondWithToken(auth('api')->refresh());
}
/**
*格式化返回token
*/
protected function respondWithToken($token)
{
return $this->response->array([
'access_token' => $token,
'token_type' => 'Bearer',
'expires_in' => auth('api')->factory()->getTTL() * 60
]);
}
}
这个 token 将可以被用来认证.
认证方式
支持以下两种方式。通过 HTTP 请求来认证:
Authorization header
Authorization: Bearer eyJhbGciOiJIUzI1NiI...
Query string parameter
http://example.dev/me?token=eyJhbGciOiJIUzI1NiI...
通过token获取用户信息
// jwt验证
public function Users(){
// 获取所有用户
// $users = User::all();
// return $this->response
// ->collection($users, new UserTransformer);
// 第一种方法 通过token获取用户信息
// $user = app('Dingo\Api\Auth\Auth')->user();
// return $user;
// 第二种方法 通过token获取用户信息
// $user = auth('api')->user();
// return $user;
// 第三种方法 通过token获取用户信息
$user = $this->auth()->user();
return $user;
}