跳坑坑,实现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 #开启rewriteEngine
#!-d的意思是不是目录或目录不存在
RewriteCond %{REQUEST_FILENAME} !-d
#!-f的意思是不是文件或文件不存在
RewriteCond %{REQUEST_FILENAME} !-f
#转给index.php处理
#^(.*)$-匹配所有的路径映射到入口文件 index.php/$1($1为变量1)
#[QSA]-表示保留参数如get传值?xxx==xx...;
#[PT]-再把这个URL交给Apache处理;
#[L]-这是最后一个匹配项,不再往下匹配
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
#增加如下内容
SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0
</IfModule>
————————————————
版权声明:本文为CSDN博主「Eleven 弦夜。」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43837229/article/details/101034248
请求时在请这里是列表文本求头上带上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
.
.
.
// Rest omitted for brevity
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
{
/**
* Create a new AuthController instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login']]);//不使用jwt的api
}
/**
* Get a JWT via given credentials.
*
* @return \Illuminate\Http\JsonResponse
*/
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);
}
/**
* Get the authenticated User.
*
* @return \Illuminate\Http\JsonResponse
*/
public function me()
{
return response()->json(JWTAuth::parseToken()->touser());
}
/**
* Log the user out (Invalidate the token).
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout()
{
JWTAuth::parseToken()->invalidate();
return response()->json(['message' => 'Successfully logged out']);
}
/**
* Refresh a token.
*
* @return \Illuminate\Http\JsonResponse
*/
public function refresh()
{
return $this->respondWithToken(JWTAuth::parseToken()->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' => JWTAuth::factory()->getTTL() * 60
]);
}
}
10.使用 Postapi 模拟请求,验证是否能正确获取 token
单个搞定
可以全局?
还有一个坑:(初学者必看)
这个位置是需要库中password是Hash加密的
Hash::make($password) 加密
//使用web 在这暂不使用
$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);
//可以转laravel的对象为数组哦
版权声明:本文为m0_50593634原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。