php如何设置权限令牌token

发布时间:2024-07-15 点击:85
php设置token的方法:1、定义获取token的路由路径;2、建立service层;3、使用usertoken类处理整个逻辑;4、在model层里建立user类;5、在验证器类和异常类创建相应的验证方法和异常处理。
推荐:《php视频教程》
php_设置权限令牌token
我们开发的后端api接口会对访问者有一个权限要求,比如一些包含私人信息的接口,就需要访问者请求接口的同时,传递一个提前已经发放给访问者的token。
这就像一个令牌一样,只有访问者展示出来我们才会“通过放行”。
下面就记录一下权限令牌的代码编写思路。
一、流程概要
定义获取token的路由路径,接受code参数(code来源:微信服务器,登录系统基于微信体系)
建立service层,在这层里创建token基类和usertoken类
usertoken类处理整个逻辑:token生成和返回
在model层里建立user类,负责用户数据表的读写,供service层的usertoken调用
在验证器类和异常类创建相应的验证方法和异常处理
控制器->service层->model层返回值给service层->service层返回值给控制器,整个流程完成token令牌的编写
二、具体说明
首先定义好路由路径:
route::post( 'api/:version/token/user', 'api/:version.token/gettoken');然后创建token控制器,定义对应路由路径的gettoken方法:
public function gettoken($code='') { (new tokenget())->gocheck($code); // 验证器 $token = (new usertoken($code))->get(); return [ 'token' => $token ]; }在调用service层之前,还得检查一下传递过来的参数,于是定义tokenget这个验证器:
class tokenget extends basevalidate{ protected $rule = [ 'code' => 'require|isnotempty' ]; protected $message = [ 'code' => '需要code才能获得token!' ]; }回到token控制器,验证通过后,我们调用service层定义的usertoken类:
$token = (new usertoken($code))->get();复制代码这里讨论一下service层和model层。我们普遍的理解是service层是基于model层的一次抽象封装。
model层只负责操作数据库并返且返回给service层然后service层处理业务逻辑,最后返回给controller层
但我觉得小项目的话,service其实和model就有点平级的意思,因为有些简单的接口model层直接对接controller就可以了,只有相对复杂的接口,比如用户权限,就可以再经过service层分隔不同功能的代码。
这样的处理更加灵活,有大量确实很简单的接口就不用过一次service层了,这样更像是走过过场而已,没什么意义了。
回到service层的代码编写,由于token还会有不同的种类,所以先创建一个token基类,里面包含一些通用的方法。然后就是给访问者返回令牌的usertoken类的编写了。
由于是基于微信,我们需要三个信息:code,appid,appsecret,然后通过构造函数来给usertoken类赋上初始值:
function __construct($code) { $this->code = $code; $this->wxappid = config('wx.app_id'); $this->wxappsecret = config('wx.app_secret'); $this->wxloginurl = sprintf( config('wx.login_url'), $this->wxappid, $this->wxappsecret, $this->code ); }然后把这三个放入微信提供的接口的参数位置,目的是获得一个完整的微信服务器端的url,请求到我们需要的openid。
然后是通过发送网络请求的步骤就在此略过。微信服务器会返回包含openid的对象,判断这个对象的值没问题后,我们就开始生成令牌的步骤了,创建函数granttoken():
private function granttoken($openidobj) { // 取出openid $openid = $openidobj['openid']; // 通过model层调用数据库,检查openid是否已经存在 $user = usermodel::getbyopenid($openid); // 如果存在,不处理,反之则新增一条user记录 if ($user) { $uid = $user->id; } else { // 不存在,生成一条数据,具体方法略过 $uid = $this->newuser($openid); } // 生成令牌,写入缓存(具体方法见下面的定义) $cachedvalue = $this->preparecachevalue($openidobj, $uid); $token = $this->savetocache($cachedvalue); // 令牌返回到调用者端 return $token;}private function preparecachevalue($openidobj, $uid) { $cachedvalue = $openidobj; $cachedvalue['uid'] = $uid; $cachedvalue['scope'] = 16; // 权限值,自己定义 return $cachedvalue;} private function savetocache($cachedvalue) { $key = self::generatetoken(); // 生成令牌的方法 $value = json_encode($cachedvalue); $tokenexpire = config('setting.token_expire'); // 设定的过期时间 $request = cache($key, $value, $tokenexpire); if (!$request) { throw new tokenexception([ 'msg' => '服务器缓存异常', 'errorcode' => 10005 ]); } return $key; // 返回令牌:token}可以看到,核心流程就是:
拿到openid查看数据库,检查openid是否已经存在如果存在,不处理,反之则新增一条user记录生成令牌,准备缓存数据,写入缓存把令牌返回到客户端去
其中generatetoken()这个方法详细定义如下:
public static function generatetoken() { $randomchars = getrandomchars(32); // 32个字符组成一组随机字符串 $timestamp = $_server['request_time_float']; $salt = config('security.token_salt'); // salt 盐 // 拼接三组字符串,进行md5加密,然后返回 return md5($randomchars.$timestamp.$salt);} function getrandomchars($length) { $str = null; $strpo

信创生态|九州云与麒麟软件完成互认证
天翼云服务器怎么加d盘内存
我的这个这个网站打开速度非常慢
今天突然远程连不上不知道是否资源已满
上饶云服务器购买
便宜云服务器托管
foxmail怎么登录新账号 foxmail登录新账号的方法
我这个备案我们没有座机号码随便写了一个您看怎么处理一下