内容简介:使用token进行身份验证过程1.客户端使用账号密码进行登录2.服务端接受到请求后验证账号以及密码的正确性,若正确则服务端回传一个Token
使用token进行身份验证过程
1.客户端使用账号密码进行登录
2.服务端接受到请求后验证账号以及密码的正确性,若正确则服务端回传一个Token
3.客户端接收到Token后对其进行存储,每次访问时需携带token
4.服务端在接受到客户端请求时需验证token有效性,验证成功则回传数据。
生成与验证token的方法有很多种,我们这里使用的是jwt( Json Web Token)。
使用前提
首先使用方法需要在composer.json中引入firebase/php-jwt,之后进行composer安装。
名称 | 解 释 |
iss (issuer) | issuer 请求实体,可以是发起请求的用户的信息,也可是jwt的签发者 |
sub (Subject) | 设置主题,类似于发邮件时的主题 |
aud (audience) | 接收jwt的一方 |
exp (expire) | token过期时间 |
nbf (not before) | 当前时间在nbf设定时间之前,该token无法使用 |
iat (issued at) | token创建时间 |
jti (JWT ID) | 对当前token设置唯一标示 |
class JWTTool extends Controller { public function __construct(ContainerInterface $container = null) { header("Content-Type: text/html; charset=utf-8"); $this->setContainer($container); } private $key = 'yayuanzi';//密钥 private $iss = "http://example.org/send";//签发者 private $aud = "http://example.org/accept";//接受者 /** * @param $data 加密的数据 * @param int $is_exp 是否加入有效时间 * @param int $time 有效时长 * @return string */ public function generateToken($data,$is_exp = 1,$time = 86400){ $token['iss'] = $this->iss; $token['aud'] = $this->aud; $token['iat'] = strtotime(date('Y-m-d H:i:s')); if($is_exp){ $token['exp'] = strtotime(date('Y-m-d H:i:s'))+$time; } $token['data'] = $data; $jwt = JWT::encode($token, $this->key);//alg,默认使用HS256方式 return $jwt; } /** * 验证 * @param $jwt * @param $client 平台号 * @return array|\Symfony\Component\HttpFoundation\Response */ public function verificationToken($jwt,$client) { $key = $this->key; //key要和签发的时候一样 try { JWT::$timestamp = strtotime(date('Y-m-d H:i:s'));//当前时间 $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应 if(empty($decoded->data)){ throw new Exception('未登录'); } if(empty($decoded->data->client)){ throw new Exception('非法操作,端口错误'); } if($decoded->data->client != $client){ throw new Exception('非法操作,端口错误'); } return Responses::arrays( '登录成功', 0, ['user_id'=>$decoded->data->user_id] ); } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 return Responses::arrays('签名错误',1); }catch(\Firebase\JWT\BeforeValidException $e) { // return Responses::arrays($e->getMessage(),1); }catch(\Firebase\JWT\ExpiredException $e) { // token过期 return Responses::arrays('登录凭证失效',-1); }catch(Exception $e) { //其他错误 return Responses::arrays($e->getMessage()); } } public function verificationOther($jwt,$data) { $key = $this->key; //key要和签发的时候一样 try { JWT::$timestamp = strtotime(date('Y-m-d H:i:s'));//当前时间 $decoded = JWT::decode($jwt, $key, ['HS256']); //HS256方式,这里要和签发的时候对应 $tag_data = (array)$decoded->data; foreach ($data as $k=>$v){ if(!array_key_exists($k,$tag_data)){ throw new Exception('验证失败'); } if($tag_data[$k] != $data[$k]){ throw new Exception('验证失败'); } } return Responses::arrays( '验证成功', 0, $data ); } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 return Responses::arrays('签名错误'); }catch(\Firebase\JWT\BeforeValidException $e) { // return Responses::arrays($e->getMessage()); }catch(\Firebase\JWT\ExpiredException $e) { // token过期 return Responses::arrays('凭证失效',1); }catch(Exception $e) { //其他错误 return Responses::arrays($e->getMessage()); } } }
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/25301.html
微信打赏
支付宝打赏
感谢您对作者Miya的打赏,我们会更加努力! 如果您想成为作者,请点我
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Design Patterns
Elisabeth Freeman、Eric Freeman、Bert Bates、Kathy Sierra、Elisabeth Robson / O'Reilly Media / 2004-11-1 / USD 49.99
You're not alone. At any given moment, somewhere in the world someone struggles with the same software design problems you have. You know you don't want to reinvent the wheel (or worse, a flat tire),......一起来看看 《Head First Design Patterns》 这本书的介绍吧!