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:100:

这段代码是在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'

]);

:+1: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!