laravel-5 - 使用 laravel 5.5 tymon jwt 为移动应用程序创建令牌(适用于未经过身份验证的用户)
问题描述
如标题所示,我想确保在移动应用程序或网络浏览器中使用 API 的用户是使用我的网站或移动应用程序的用户,没有第三方可以使用我的 API
这可以通过为可以使用正确凭据登录的用户创建令牌来轻松完成,但我的项目由经过身份验证的用户或未经过身份验证的用户可以执行 CRUD 的部分组成
所以基本上我只希望使用我的移动应用程序或我的网站的用户能够使用我的 API 没有第三方可以使用我的 API,除了那些被授权使用我的 API 的人
解决方案
好吧,您可以声明ApiController
从哪里可以检查user_token
并检查它们的标题。为此,您必须创建一个名为user_tokens
. 该表应如下所示:
+-----+---------+-----------+------------+
| id | user_id | usertoken | timestamps |
+-----+---------+-----------+------------+
此表one-to-one
与表有关系users
。从您要使用的设备中,api
您必须通过 thisuser_id
和usertoken
as headers
。然后,您必须ApiController
通过以下代码检查您的标头以进行身份验证:
public function checktoken(Request $request){
if ($request->headers->has('usertoken')) {
$token = $request->header('usertoken');
$usertoken = UserToken::where('usertoken',$token)->first();
if ($usertoken) {
return $usertoken;
}
return false;
}
return false;
}
以下是从 api 登录的示例:
public function postlogin(Request $request){
$validator = Validator::make($request->all(), User::$auth_rules);
if ($validator->fails()){
$result['status']='fail';
$result['message']='Validation unseccessful';
return $result;
}
$remember=$request->has('remember')?true:false;
$user=User::where('email',$request->get('email'))->first();
if (Auth::attempt(array('phone' => $request->input('email'), 'password' => $request->input('password')), $remember)){
$usertoken=new UserToken;
$usertoken->user_id=$user->id;
$usertoken->usertoken=$user->remember_token;
$save=$usertoken->save();
if ($save){
$usertoken=UserToken::where('user_id', $user->id)->first();
$token=$usertoken->usertoken;
if (!$token) {
$token=str_random(60);
$usertoken->usertoken=$token;
$update=$usertoken->update();
}
$result['status']='success';
$result['message']='Login successful';
$result['data']=$token;
return $result;
}
}
$result['status']='fail';
$result['message']='Invalid credentials';
return $result;
}
现在您可以通过这个检查令牌作为服务器端的身份验证(假设您的用户想要更改密码):
public function postchangepassword(Request $request){
$usertoken = $this->checktoken($request); // this here gets the token for authentication
if ($usertoken) {
$validator = Validator::make($request->all(), User::$password_rules);
if ($validator->fails()){
$result['status']='fail';
$result['message']='Validation unseccessful';
return $result;
}
$user=$usertoken->user()->first(); // you are geting authenticated user by this
if(Hash::check($request->get('password'), $user->password)){
$user->password=bcrypt($request->get('newpassword'));
$update=$user->update();
if($update){
$result['status']='successful';
$result['message']='Password updated';
return $result;
}
$result['status']='fail';
$result['message']='Password could not be updated';
return $result;
}
$result['status']='fail';
$result['message']='Current password is wrong';
return $result;
}
$result['status']='fail';
$result['message']='Invalid token';
return $result;
}
希望这可以帮助。
推荐阅读
- python - 如何查看带有条件元素的许多图像
- reactjs - 钩子在子组件中的单个更改上重新渲染整个页面
- r - 从多个 XML 文件创建文本数据框
- reactjs - useContext 与 immutableJS
- c - C将void指针数组传递给函数
- php - 我想问如何将此mysqli代码更改为PDO?其他页面无法解决我的问题
- powershell - 从 Get-Childitem 捕获不可访问文件夹的路径
- python - 如何在 django rest 框架序列化程序中序列化布尔值列表?
- javascript - this.props.navigation.navigate() 不工作
- python - Confused Regarding PyTorch GRU Docs