准备好基础框架后,就可以开始准备起接口了。准备最最基础的登录注册接口。
需要做以下处理:
- 准备 user 表的迁移文件。
- 准备 jwt
- 准备好路由以及文件结构
- 相关注册逻辑。
先准备 user 表的迁移文件
默认就有了 user 表的迁移,我们直接修改它就好。
$table->bigIncrements('id');
$table->string('account', 16)->unique();
$table->string('password');
$table->unsignedInteger('viewid')->unique();
$table->string('phone', 16)->unique();
$table->string('email')->nullable();
$table->string('nickname');
$table->string('avatar')->default('app/public/upload/image/avatar/default.jpg');
$table->string('signture')->nullable();
$table->timestamp('email_verified_at')->nullable();
$table->rememberToken();
$table->nullableTimestamps();
# 执行迁移
php artisan migrate
创建 Models 目录。
# App 目录下创建 Models 文件夹,并将 User 模型移动到该文件夹下
mkdir App/Models
mv App/User.php App/Models/User.php
再修改 User 的命名空间,并将整个框架的 User 的命名空间变更。
安装 jwt
# 安装
composer require tymon/jwt-auth:1.0.0-rc.5
# 生成 jwt 的 secret
php artisan jwt:secret
jwt-auth
有两个重要的参数,可以在 .env
中进行设置
JWT_TTL
生成的 token
在多少分钟后过期,默认 60 分钟
JWT_REFRESH_TTL
生成的 token
,在多少分钟内,可以刷新获取一个新 token
,默认 20160 分钟,14 天。
这里需要理解一下 JWT
的过期和刷新机制,过期很好理解,超过了这个时间,token
就无效了。刷新时间一般比过期时间长,只要在这个刷新时间内,即使 token
过期了, 依然可以换取一个新的 token
,以达到应用长期可用,不需要重新登录的目的。
# 编辑 .env 增加 jwt 的过期配置和刷新配置
vim .env
# 增加下边两个配置
JWT_TTL= 10080
JWT_REFRESH_TTL=20160
修改完善 User 模型,使其继承 Tymon\JWTAuth\Contracts\JWTSubject
接口,并实现接口的两个方法 getJWTIdentifier()
和 getJWTCustomClaims()
于是 User 模型中的类容为:
<?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
{
use Notifiable;
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
protected $fillable = [
'account', 'password', 'viewid', 'phone', 'email', 'nickname', 'avatar', 'signture'
];
protected $hidden = [
'password', 'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
}
我们启动 tinker,先创建一个用户,再尝试获取 jwt token。
# 启动 tinker
php artisan tinker
use App\Models\User;
use Hash;
use Auth;
$user = [
'account' => '1367163xxxx',
'password' => Hash::make('123456'),
'phone' => '1367163xxxx',
'nickname' => '七月羽歌',
'signture' => '美的事物是永恒的喜悦'
];
# 创建用户
User::create($data);
# 获取用户
$user = User::first();
# 获取 token
Auth::guard('api')->login($user);
新建用户登录注册控制器
# 创建控制器
php artisan make:controller Api/AuthorizationsController
# 创建 request
php artisan make:request Api/AuthorizationRequest
然后编辑 request
<?php
namespace App\Http\Requests\Api;
use Illuminate\Foundation\Http\FormRequest;
class AuthorizationRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'account' => 'required|regex:/^1[1-9]\d{9}$/',
'password' => 'required|alpha_dash|min:6'
];
}
}
控制器代码
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\AuthorizationRequest;
use Illuminate\Auth\AuthenticationException;
use Auth;
class AuthorizationsController extends Controller
{
public function login(AuthorizationRequest $request)
{
$data = $request->only(['account', 'password']);
if (!$token = Auth::guard('api')->attempt($data)) {
throw new AuthenticationException('用户名或密码错误');
}
return $this->respondWithToken($token)->setStatusCode(200);
}
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
'expires_in' => auth('api')->factory()->getTTL() * 60
]);
}
}
路由
Route::namespace('Api')->group(function () {
Route::post('authorizations/login', 'AuthorizationsController@login')->name('api.authorizations.login');
});
然后使用 postman 测试下
登录好了,下一步就处理 ant design pro 框架。构建基础的功能以及去掉不需要的功能,美化页面。
有用的参考
https://www.jianshu.com/p/344c5e540eaa