跳坑坑,实现laravel的jwt(详细):
首先坑的运行环境 看是nginx 还是apache nginx没有坑, apache有 用户认证 JWT 完整使用详解:https://laravel-china.org/articles/10885/full-use-of-jwt 吃亏是福😝😜🤪😝
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
</IfModule>
————————————————
版权声明:本文为CSDN博主「Eleven 弦夜。」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https:
请求时在请这里是列表文本求头上带上Authorization参数:
Authorization:Bearer your_token
但是在认证类中取不到该参数。 解决方法: 在.htaccess文件中加入
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
上流程
1.安装 jwt-auth
composer require tymon/jwt-auth:1.0.0-rc.2
2.输入以下命令,在config下增加一个jwt.php的配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
生成
3.安装完成后,需要设置一下 JWT 的 secret,这个 secret 很重要,用于最后的签名,更换这个secret 会导致之前生成的所有 token 无效
php artisan jwt:secret
4.修改 config/auth.php文件,将 api的 driver 改为 jwt
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
5.注册两个 Facade,在config/app.php文件中,添加以下内容
'aliases' => [
...
'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth',
'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory',
],
6.修改app\Models\User.php文件,用user表来生成token
<?php
namespace App\Models;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject
.
.
.
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
}
7.修改route/api.php文件,为需要的路由加上token(在 Laravel 下,route/api.php 中的路由默认都有前缀 api)
Route::group([
'prefix' => 'auth'
], function ($router) {
Route::post('login', 'AuthController@login');
Route::post('logout', 'AuthController@logout');
Route::post('refresh', 'AuthController@refresh');
Route::post('me', 'AuthController@me');
});
8.输入以下命令,创建 token 控制器(也可以手动创建类)
php artisan make:controller AuthController
- 复制以下内容替换AuthController.php中内容
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Facades\JWTAuth;
class AuthController extends Controller
{
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login']]);
}
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
$userArr = User::where(['phone' => $phone])
->where('status', 1)->first();
$token = auth('api')->login($userArr);
$instertUser = [
'type_men' => $type_men,
'phone' => $phone,
'password' => Hash::make($password),
];
$user = User::create($instertUser);
return JWTAuth::fromUser($user);
}
public function me()
{
return response()->json(JWTAuth::parseToken()->touser());
}
public function logout()
{
JWTAuth::parseToken()->invalidate();
return response()->json(['message' => 'Successfully logged out']);
}
public function refresh()
{
return $this->respondWithToken(JWTAuth::parseToken()->refresh());
}
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => JWTAuth::factory()->getTTL() * 60
]);
}
}
10.使用 Postapi 模拟请求,验证是否能正确获取 token 单个搞定
可以全局🤩 还有一个坑:(初学者必看) 这个位置是需要库中password是Hash加密的
Hash::make($password) 加密
$user = AdminUser::where('username', $credentials['username'])
->where('status', 1)
->first();
if (!$user || !Hash::check($credentials['password'], $user->password)) {
return error('用户名或密码错误');
}
降龙十八掌打完收工
加一个小点
$findClass = Classes::where('user_id', $user->id)->first();
$user = json_decode(json_encode($user, true), true);
|