Laravel API Token 体验;实现简单的注册、登录、获取用户信息
简介
Laravel API 默认驱动为 token,文档上没介绍如何使用,下面让我们来实现它。
'api' => [
'driver' => 'token',
'provider' => 'users',
],
配置字段
项目下执行命令生成迁移文件
php artisan make:migration update_users_table_for_api_token --table=users
laravel6迁移文件在 /database/migtions中。
修改迁移文件
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
//字段名固定,长度建议32以上
$table->string('remember_token', 64)->unique();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('remember_token');
});
}
提示:laravel6框架自带的迁移文件中有remember_token字段
项目下执行迁移命令。数据表 users 会添加 api_token 字段
php artisan migrate
注意回到数据库检查
这里生成的api_token字段表头为‘remember_token’
配置模型
添加 api_token 到 User 模型 $fillable 和 $hidden 属性
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password','api_token(这个位置填上面说的表头)',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token','api_token(这个位置填上面说的表头)'
];
tips
这段代码是在Laravel Eloquent模型中定义了一些属性,这些属性用于指定哪些字段可以被批量赋值、哪些字段在数组中应该被隐藏、以及哪些字段应该被转换为原生数据类型。
1. $fillable 属性指定了哪些字段可以被批量赋值。这是为了防止恶意用户通过表单提交修改模型中的任意字段。在这个例子中,name、email、password和remember_token字段可以被批量赋值。
2. $hidden 属性指定了哪些字段在模型被转换为数组时应该被隐藏。这对于在API响应中隐藏敏感信息很有用。在这个例子中,password和remember_token字段在模型被转换为数组时会被隐藏。
3. $casts 属性指定了哪些字段应该被转换为原生数据类型。在这个例子中,email_verified_at字段会被转换为datetime类型,这意味着当你访问这个字段时,它会被自动转换为PHP的DateTime对象。
生成 api_token(注册)
代码放在注册控制器 app/Http/Controllers/Auth/RegisterController.php 里面。
/*
* 用户注册
*/
protected function create(Request $request)
{
$data = $request->only('name', 'email', 'password', 'password_confirmation');
/*
* 这里的only方法是只接受$request里面的('name', 'email', 'password'(密码), 'password_confirmation(二次确认密码')
*/
$rule = Validator::make($data, [
'name' => ['required', 'string', 'min:3', 'max:8'],
'email' => ['required', 'string', 'email', 'unique:users'],
'password' => ['required', 'string', 'min:6', 'confirmed']
],
/*
* Validator::make方法第一个参数写被验证的变量,
* 第二个参数(数组)写验证规则,
* 第三个参数写自定义验证失败fails()返回的信息.
*'unique' :用于确保指定的字段在数据库表中是唯一的
* confirmed: 是二次确认,是将该参数与password_confirmation进行比较;注意这两个参数写法有固定格式:例如 第一个是 abc, 第二个就必须是 abc__confirmation!
*/
[
'email.unique' => '邮箱已被注册'
]
);
/*
* 这里用来校验用户输入是否合法,
*/
if ($rule->fails()) {
return [
'errno' => 1,
'message' => $rule->errors()->first()
];
}
/*
* 校验通过创建新user
*/
$user = User::create([
'name' => $data['name'],
'password' => md5($data['password']),//这里的MD5是加密方法,后面()里被加密;
'email' => $data['email'],
'remember_token' => Str::random(60),//随机生成一个60位的字符串
]);
if ($user) {
return response()->json([
'status' => '0',
'msg' => '注册成功'
]);
}
return response()->json([
'status' => '1',
'msg' => '注册失败稍后再试!'
]);
}
路由:
Route::post('/create',[
\App\Http\Controllers\Auth\RegisterController::class,'create'
]);
登录、获取token
public function login(Request $request)
{
$data = $request->only('email', 'password');
/*
* 校验输入格式
*/
$rule = Validator::make($data, [
'email' => ['required', 'string', 'email',],
'password' => ['required', 'string', 'min:6',]
]);
if ($rule->fails()) {
return response()->json([
'status' => '0',
'msg' => $rule->errors()->first()]);
}
/*
* 查询用户
*/
$userInfo = User::where('email', $data['email'])->first();
/*
* 校验是否未注册
*/
if (empty($userInfo)) {
return response()->json([
'msg' => '用户不存在,请先注册',
'status' => '0',
]);
}
/*
* 检验密码是否正确
*/
if (md5($data['password']) != $userInfo['password']) {
return response()->json(
[
'status' => '0',
'msg' => '密码有误'
]
);
}
return response()->json([
'status' => '0',
'token' => $userInfo['remember_token']
]);
}
路由:
//用户登录
Route::post('/login',[
\App\Http\Controllers\Auth\RegisterController::class,'login'
]);
使用token查询用户信息
public function getUserInfo(Request $request)
{
/*
* 这里通过$request下面的hasHeader方法检查请求头部是否有Token
*/
if (!$request->hasHeader('token')) {
return response()->json([
'status' => '0',
'msg' => '请先登录'
]);
}
/*
* Token
*/
$token = $request->header('token');
/*
* 在数据库中查询token
*/
$userInfo = User::where('remember_token', $token)->first();
/*
*如果查到了直接返回给用户
*/
if ($userInfo) {
return response()->json([
'userInfo' => $userInfo
]);
}
/*
* 没有查到则返回错误信息
*/
return response()->json([
'status'=>'0',
'msg'=>'获取用户信息失败,请尝试重新登录!'
]);
}
路由:
Route::get('getUserInfo',[
\App\Http\Controllers\Auth\RegisterController::class,'getUserInfo'
]);
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: