php如何设置 token
php设置token的方法:首先定义获取Token的路由路径;然后建立Service层;接着在Model层里建立User类,并在验证器类和异常类创建相应的验证方法和异常处理;最后完成Token令牌的编写即可。
推荐:《PHP视频教程》
我们开发的后端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; $strPoll = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $max = strlen($strPoll) - 1; for ($i = 0; $i < $length; $i++) { $str .= $strPoll[rand(0, $max)]; } return $str; }
它的主要作用毫无疑问就是生成我们的需要的令牌——Token字符串。值得一提的是由于generateToken()在其他类型的Token里也会用到,所以是放在Token基类里的。
至此,只需要把生成的令牌再返回到Controller就行了。
三、总结
令牌的编写涉及到很多的流程,为了避免混乱,一定要注意把负责不同工作的代码分别定义在不同的方法里。就像上面例子里grantToken()方法体现的那样,这是个核心方法,包含所有流程,但是不同的具体流程又定义在其他方法里,然后提供给grantToken()方法调用。
这样做之后grantToken()方法即使包含所有流程,但也依然很容易阅读。
Atas ialah kandungan terperinci php如何设置 token. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Penyelesaian kepada token log masuk yang tidak sah termasuk menyemak sama ada token telah tamat tempoh, menyemak sama ada token itu betul, menyemak sama ada token telah diganggu, menyemak sama ada token sepadan dengan pengguna, mengosongkan cache atau kuki, menyemak sambungan rangkaian dan status pelayan , log masuk semula atau meminta token baharu Hubungi sokongan teknikal atau pembangun, dsb. Pengenalan terperinci: 1. Semak sama ada Token telah tamat tempoh Token log masuk biasanya mempunyai tempoh sah yang ditetapkan Setelah tempoh sah melebihi, ia akan dianggap tidak sah, dsb.

Masalah token log masuk tidak sah boleh diselesaikan dengan menyemak sambungan rangkaian, menyemak tempoh sah token, mengosongkan cache dan kuki, menyemak status log masuk, menghubungi pembangun aplikasi dan mengukuhkan keselamatan akaun. Pengenalan terperinci: 1. Semak sambungan rangkaian, sambung semula ke rangkaian atau tukar persekitaran rangkaian 2. Semak tempoh sah token, dapatkan token baharu, atau hubungi pembangun aplikasi 3. Kosongkan cache dan kuki, kosongkan penyemak imbas; cache dan Cookie, dan kemudian log masuk ke aplikasi sekali lagi 4. Semak status log masuk.

Redis menyimpan token pengguna Apabila mereka bentuk sistem yang serupa dengan e-dagang, keperluan biasa ialah setiap halaman perlu membawa maklumat pengguna yang dilog masuk. Terdapat dua penyelesaian biasa: menggunakan kuki untuk menyimpan dan menggunakan JWT untuk menyimpan Tetapi jika cache Redis digunakan dalam sistem, terdapat juga penyelesaian ketiga - caching token pengguna dalam Redis. Hasilkan token apabila log masuk dan simpan dalam Redis // Jana objek token dan simpan dalam redis redisTemplate.opsForHash().put("token","user",user)

1. Pengesahan log masuk token jwt: JSONWebToken. Ia ialah protokol pengesahan yang biasanya digunakan untuk mengesahkan maklumat identiti yang diminta dan kebenaran identiti. Terdiri daripada tiga bahagian: Header, Hayload, Signatureheader: iaitu maklumat pengepala, iaitu maklumat asas yang menerangkan token ini, format json {"alg":"HS256", //menunjukkan algoritma tandatangan, lalainya ialah HMACSHA256 ( ditulis sebagai HS256) "jenis":"JWT"//Menunjukkan jenis Token JWT ditulis secara seragam sebagai JWT}pa

Token ialah sejenis mata wang maya Ia adalah mata wang digital yang digunakan untuk mewakili kebenaran pengguna, merekod maklumat transaksi dan membayar mata wang maya. Token boleh digunakan untuk menjalankan transaksi pada rangkaian tertentu, ia boleh digunakan untuk membeli atau menjual mata wang maya tertentu, dan ia juga boleh digunakan untuk membayar perkhidmatan tertentu.

Bagaimana untuk menyelesaikan ralat sintaks C++: 'expectedprimary-expressionbefore':'token'? Ralat sintaks adalah masalah biasa dalam pengaturcaraan C++. Salah satu ralat biasa ialah mesej ralat "expectedprimary-expressionbefore':'token". Ralat ini biasanya berlaku apabila menggunakan ungkapan bersyarat dan pengendali ternary. Artikel ini akan memperkenalkan punca ralat ini

Tanpa diduga, ChatGPT masih akan melakukan kesilapan bodoh sehingga hari ini? Master Ng Enda menunjukkannya pada kelas terkini: ChatGPT tidak akan membalikkan perkataan! Sebagai contoh, biarkan ia membalikkan perkataan lollipop, dan outputnya adalah pilollol, yang benar-benar mengelirukan. Oh, ini memang agak mengejutkan. Sehinggakan selepas seorang netizen yang mendengar kelas menyiarkan siaran di Reddit, ia serta-merta menarik sebilangan besar penonton, dan siaran itu dengan cepat mencapai 6k tontonan. Dan ini bukan pepijat yang tidak disengajakan. Netizen mendapati bahawa ChatGPT sememangnya tidak dapat menyelesaikan tugasan ini, dan keputusan ujian peribadi kami juga sama. △Ujian sebenar ChatGPT (GPT-3.5) dan juga banyak produk termasuk Bard, Bing, Wen Xinyiyan, dll. tidak berfungsi. △Ujian sebenar Bard△Ujian sebenar Wenxinyiyan

Token dalam Vue ialah rentetan rentetan yang dijana pada bahagian pelayan, digunakan sebagai token untuk permintaan pelanggan adalah seperti berikut: 1. Merangkumkan kaedah mengendalikan storan tempatan 2. Selepas merangkum storan, gunakannya ke Mount ia ke dalam komponen global; 3. Letakkan "token" dalam "request.js";
