用户完成注册以后我们需要跳转到后台首页,而后台的访问是需要token的,在之前的用户登录一文中我们通过提供用户名和密码的方式来生成了token,那么对于注册而言,我们也可以使用这种方式,模拟用户登录的过程,进而获取到token。
采用这种“曲线救国”的方式估计会被经理给一通暴打,其实JWT给我们提供了另一种方式来获取token,那就是利用用户对象来获取token。
我们注册时采用的是create方式,正好返回给我们一个用户对象,我们利用这个用户对象来生成token:
public function register(UserRegisterRequest $userRegisterRequest){
$user = User::create([
'username' => $userRegisterRequest->username,
'email' => $userRegisterRequest->email,
'password' => Hash::make($userRegisterRequest->password)
]);
event(new Registered($user));
$token = auth('api')->fromUser($user);
return $this->respondWithToken($token);
}
前端的register方法也要进行修改,修改后的代码为:
register({ commit }, registerForm) {
return new Promise((resolve, reject) => {
register({
username: registerForm.username,
email: registerForm.email,
password: registerForm.password
}).then(response => {
const { data } = response
console.log(data)
commit('SET_TOKEN', data.access_token)
setToken(data.access_token)
resolve()
}).catch(error => {
const errorResponse = error.response
console.log(errorResponse)
switch (errorResponse.status) {
case 422:
// const message = getFirst(errorResponse.data.errors)
Message({
message: getFirst(errorResponse.data.errors)[0],
type: 'error',
duration: 5 * 1000
})
}
reject(error)
})
})
},
有一个地方需要注意的是前端是需要后端返回用户角色才能生成路由的,而新注册的用户是没有配置角色的,我们先给返回用户角色的方法中用户角色一个默认值:
public function me(){
$user = auth()->user()->makeHidden(['created_at','updated_at','nickname']);
$roles = $user->roles()->pluck('name');
$roles = empty($roles) ? $roles : ['admin'];
$user->roles = $roles;
return response()->json([
'code' => 20000,
'msg' => '获取用户信息成功',
'data' => $user
]);
}
给roles赋默认值时使用??是实现不了的,具体原因大家自行百度即可。
经过一系列的操作,我们用户注册后实现了前后端校验、数据入库、自动发送邮件、生成token、跳转后台首页等功能。
往期回顾
利用事件系统在用户注册后发送邮件
Laravel事件系统简介
完成用户注册
vue-element-admin捕获422状态码(其它状态码以此类推)
利用Laravel请求验证注册信息