续:jwt的安装与使用--Auth认证

说明:仍是按照文档
auth的认证,
一是判断登陆状态(auth),如未登陆则被拦截,然后转交给登陆模块,这需要一个中间件来完成。
二是管理登陆,即登陆逻辑login,登陆成功则发送给用户一个授权token;及logout退出登陆,销毁token;忘记密码forgetPassword;注册signUp等。这需要一个专门的控制器来完成,在这里编写自定义逻辑。
在这之前,请阅读文档,一些配置略过。

1,创建Auth控制器

php artisan make:controller Api\V1\AuthController

然后只需从文档的example复制粘贴

namespace App\Http\Controllers\Api\V1;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
	//登陆
	public function login()
	{
		$credentials = request(['email', 'password']);
		//$credentials = request(['mobile', 'password']);

		if (! $token = auth()->attempt($credentials)) {
			return response()->json(['error' => '用户名密码错误'], 401);
		}

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

	//注册
	public function signUp( Request $request ) {
		$post = $request->all();
		//...验证
		$user = User::create($post); //创建用户
		$token = auth()->login($user); //登陆
		return $this->respondWithToken($token);
	}

	//忘记密码
	public function forgetPassword( Request $request ) {
		//$user = .. 更改密码逻辑
		//$user->save()
		//$token = auth()->login($user);
		//return Y::json($this->respondWithToken($token));
	}

	//me
	public function me(  ) {
		$user  = auth()->user()->toArray();
		//$user['']=... 自定义逻辑
		return response()->json($user);
	}

	//退出登陆
	public function logout()
	{
		auth()->logout();
		//User::clearCache(auth()->id(), false); //如果你想对用户信息做缓存的话
		return response()->json(['message' => 'Successfully logged out']);
	}

	//刷新token
	public function refresh()
	{
		return $this->respondWithToken(auth()->refresh());
	}

	//生成token
	protected function respondWithToken($token)
	{
		return response()->json([
			//'username'     =>auth()->user()->username,
			'access_token' => $token,
			'token_type' => 'bearer',//可以更改
			'expires_in' => auth()->factory()->getTTL() * 60
		]);
	}
}

当然不要忘了添加对应的路由

Route::group(
	['prefix'=>'v1','namespace'=>'V1'],
	function(){
		
		Route::prefix('auth')->group(function () {
			Route::post('login', 'AuthController@login');
			Route::post('signUp', 'AuthController@signUp');
			Route::post('forgetPassword', 'AuthController@forgetPassword');
			Route::get('logout', 'AuthController@logout');
			Route::get('refresh', 'AuthController@refresh');
		});
		
	}
);

2,测试

使用postman工具

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

因为我们的注册逻辑并没有写,所以手动在users表中,添加[email protected],password= Hash::make(123456);
在这里插入图片描述

这里jwt组件的使用就算完成了。之后的每次请求,携带上access_token。
复制刚刚的access_token

在这里插入图片描述


在这里插入图片描述

3,第二部分,回到文章开头的中间件部分。

文档中是这么写的

public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

但也可以用专门的中间件来完成,易管理和扩展。

php artisan make:middleware ApiAuth

在这里插入图片描述


在这里插入图片描述

编写中间件

public function handle($request, Closure $next)
{
        $auth = auth();
        $auth->shouldUse('api');
        if ($request->is(...$this->except) || ($auth->check() && $auth->user()->status == 1)) {
            return $next($request);
        }
       return response()->json(['code'=>401,'message' => '用户验证失败,请重新登录']);
}
protected $except = [
        'v1/auth/login', //登陆
        'v1/auth/signUp', //注册
        'v1/sendSms', //发送邮件
        'v1/test/*', //测试
    ];

这里除了判断登陆,还对当用户是否被禁用状态的判断。并且添加了不需要验证的路由。

注册中间件
在这里插入图片描述

使用中间件
在这里插入图片描述

测试:

刚刚我退出了登陆,下面请求forgetPassword方法。
在这里插入图片描述


在这里插入图片描述

end

猜你喜欢

转载自blog.csdn.net/yt_php/article/details/86359488