PHP

JWT类库<?php/***PHP实现jwt*/classJwt{//头部privatestatic$header=array('alg'=>'HS256',//生成signature的算法'typ'=>'JWT'//类型);//使用HMAC生成信息摘要时所使用的密钥privatestatic$key='mini!@!@^@^$%#$--*$#@(*)&&*Bingpo';/***获取jwttoken*@paramarray$payloadjwt载荷格式如下非必须*[*'iss'=>'jwt_admin',//该JWT的签发者*'iat'=>time(),//签发时间*'exp'=>time()+7200,//过期时间*'nbf'=>time()+60,//该时间之前不接收处理该Token*'sub'=>'www.admin.com',//面向的用户*'jti'=>md5(uniqid('JWT').time())//该Token唯一标识*]*@returnbool|string*/publicstaticfunctiongetToken(array$payload){if(is_array($payload)){$base64header=self::base64UrlEncode(json_encode(self::$header,JSON_UNESCAPED_UNICODE));$base64payload=self::base64UrlEncode(json_encode($payload,JSON_UNESCAPED_UNICODE));$token=$base64header.'.'.$base64payload.'.'.self::signature($base64header.'.'.$base64payload,self::$key,self::$header['alg']);return$token;}else{returnfalse;}}/***验证token是否有效,默认验证exp,nbf,iat时间*@paramstring$Token需要验证的token*@returnbool|string*/publicstaticfunctionverifyToken(string$Token){$tokens=explode('.',$Token);if(count($tokens)!=3)returnfalse;list($base64header,$base64payload,$sign)=$tokens;//获取jwt算法$base64decodeheader=json_decode(self::base64UrlDecode($base64header),JSON_OBJECT_AS_ARRAY);if(empty($base64decodeheader['alg']))returnfalse;//签名验证if(self::signature($base64header.'.'.$base64payload,self::$key,$base64decodeheader['alg'])!==$sign)returnfalse;$payload=json_decode(self::base64UrlDecode($base64payload),JSON_OBJECT_AS_ARRAY);//签发时间大于当前服务器时间验证失败if(isset($payload['iat'])&&$payload['iat']>time())returnfalse;//过期时间小宇当前服务器时间验证失败if(isset($payload['exp'])&&$payload['exp']<time())returnfalse;//该nbf时间之前不接收处理该Tokenif(isset($payload['nbf'])&&$payload['nbf']>time())returnfalse;return$payload;}/***base64UrlEncodehttps://jwt.io/中base64UrlEncode编码实现*@paramstring$input需要编码的字符串*@returnstring*/privatestaticfunctionbase64UrlEncode(string$input){returnstr_replace('=','',strtr(base64_encode($input),'+/','-_'));}/***base64UrlEncodehttps://jwt.io/中base64UrlEncode解码实现*@paramstring$input需要解码的字符串*@returnbool|string*/privatestaticfunctionbase64UrlDecode(string$input){$remainder=strlen($input)%4;if($remainder){$addlen=4-$remainder;$input.=str_repeat('=',$addlen);}returnbase64_decode(strtr($input,'-_','+/'));}/***HMACSHA256签名https://jwt.io/中HMACSHA256签名实现*@paramstring$input为base64UrlEncode(header).".".base64UrlEncode(payload)*@paramstring$key*@paramstring$alg算法方式*@returnmixed*/privatestaticfunctionsignature(string$input,string$key,string$alg='HS256'){$alg_config=array('HS256'=>'sha256');returnself::base64UrlEncode(hash_hmac($alg_config[$alg],$input,$key,true));}}调用方法引入之后用下面方法使用签发token$payload_test=array('iss'=>'Bingpo','iat'=>time(),'exp'=>time()+21600,'nbf'=>time(),'sub'=>'5','jti'=>md5(uniqid('JWT').time()));$token_test=Jwt::getToken($payload_test);echo$token_test;验证token$getPayload_test=Jwt::verifyToken($token_test);var_dump($getPayload_test);这是我见过最简单的php封装的库,不像别的看着繁琐的一批!

2020-7-9 218 0
PHP

发布的新文章直接推送给百度首先打开文件/dede/article_add.php文件,这个是文章发布文件然后搜索//返回成功信息在这句话的上面粘贴进去以下代码$urls=array('http://www.bp456.cn'.$artUrl);$api='http://data.zz.baidu.com/urls?site=XXXXXXXXX&token=XXXXXXXXXXXX';//在百度站长平台获取主动推送的接口地址$ch=curl_init();$options=array(CURLOPT_URL=>$api,CURLOPT_POST=>true,CURLOPT_RETURNTRANSFER=>true,CURLOPT_POSTFIELDS=>implode("\n",$urls),CURLOPT_HTTPHEADER=>array('Content-Type:text/plain'),);curl_setopt_array($ch,$options);$result=curl_exec($ch);首先关于这段代码解释一下,如果你的织梦站没有开启绝对地址,就按照这个代码复制就可以,如果开启了绝对地址,就不要在$artUrl前面拼接自己的网址了直接写$artUrl就可以。(织梦站默认不开启绝对地址,如果你没有印象开启过,直接复制我的代码就可以)。然后把网址改成自己的,接口地址里面的XXXXXX需要根据百度给你提供的自己填写(建议直接复制整个api地址来替换我的,不建议只复制网址和Token,可能百度的api地址会更换)然后这样就可以实现自动推送功能,但是看不到百度的返回值。如果需要加入看到返回值需要再搜索找到<u>已发布文章管理</u>,然后再这段话的下一行的下一行。粘贴<a><u>主动推送反馈结果".$result."</u></a>这段代码就可以了。发布效果:生成静态的时候批量进行推送首先需要找到/dede/templets/makehtml_archives.htm文件。<tr><tdheight="20"bgcolor="#FFFFFF">每页生成:</td><tdheight="20"bgcolor="#FFFFFF"><inputname="pagesize"type="text"id="pagesize"value="20"size="8">个文件</td></tr>然后在这段html代码的后面增加上是否推送的选项代码<tr><tdheight="20"bgcolor="#FFFFFF">是否需要推送:</td><tdheight="20"bgcolor="#FFFFFF"><label><inputname="tuisong"type="radio"value="0"checked="checked"/>不推送</label><label><inputname="tuisong"type="radio"value="1"/>推送</label></td></tr>然后再打开/dede/makehtml_archives_action.php文件在开头部分找到$serviterm=empty($serviterm)?"":$serviterm;在此代码下面增加两行代码,如下$zongshu=(empty($zongshu)?0:$zongshu);$tuisong=(empty($tuisong)?0:$tuisong);这两行代码,一个是创建储存推送成功总数的变量,一个是用来接收是否推送的参数变量。继续查找:while($row=$dsql->GetObject('out')){$tjnum++;$id=$row->id;$ac=newArchives($id);$rurl=$ac->MakeHtml($isremote);}复制其中的一段代码,进行查找,就可以找到这个循环。然后在这段代码的前面添加$urls=array();在$rurl=$ac->MakeHtml($isremote);这段代码的下一行加入array_push($urls,"http://wwwbp456.cn".$rurl);在刚才那个while循环的后面加入推送代码if($tuisong==0){$urls=array();}else{$api='http://data.zz.baidu.com/urls?site=XXXXXXXXXX&token=XXXXXXX';//在百度站长平台获取主动推送的接口地址$ch=curl_init();$options=array(CURLOPT_URL=>$api,CURLOPT_POST=>true,CURLOPT_RETURNTRANSFER=>true,CURLOPT_POSTFIELDS=>implode("\n",$urls),CURLOPT_HTTPHEADER=>array('Content-Type:text/plain'),);curl_setopt_array($ch,$options);$result=curl_exec($ch);$result_arr=json_decode($result,true);if(!isset($result_arr['success'])){$result_arr['success']=0;}$zongshu=$zongshu+$result_arr['success'];}接口地址里面的XXXXXX需要根据百度给你提供的自己填写(建议直接复制整个api地址来替换我的,不建议只复制网址和Token,可能百度的api地址会更换)继续搜索:$nurl="makehtml_archives_action.php?endid=$endid&startid=$startid&typeid=$typeid";替换为$nurl="makehtml_archives_action.php?zongshu=$zongshu&tuisong=$tuisong&endid=$endid&startid=$startid&typeid=$typeid";继续搜索:ShowMsg("完成所有创建任务!把那一整句,看好了,把搜索到的那一整句替换为ShowMsg("完成所有创建任务!,推送成功总数:$zongshu<br>百度返回信息:$result<br>生成文件:$totalnum总用时:{$ttime}分钟。","javascript:;");到此教程结束。效果预览:需要批量推送的时候,就到更新文档里,生成相应的文章就可以了。生成的过程中就会推送。其实百度还提供了,当文章修改和文章删除的推送接口。看到这里,懂的可能明白了,可以通过修改关键核心代码,来实现文章修改和删除的推送。等用到有需求的时候,在更新修改和删除吧。