<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>运达&#039;s  blog &#187; laravel</title>
	<atom:link href="https://www.yunda51.com/?feed=rss2&#038;tag=laravel" rel="self" type="application/rss+xml" />
	<link>https://www.yunda51.com</link>
	<description>运达的博客</description>
	<lastBuildDate>Wed, 12 Nov 2025 07:58:26 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0.19</generator>
	<item>
		<title>Laravel10使用JWT生成Token及验证Token实现登录功能</title>
		<link>https://www.yunda51.com/?p=2016</link>
		<comments>https://www.yunda51.com/?p=2016#comments</comments>
		<pubDate>Fri, 12 Jul 2024 09:38:02 +0000</pubDate>
		<dc:creator><![CDATA[运达]]></dc:creator>
				<category><![CDATA[php技术]]></category>
		<category><![CDATA[Jwt]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://www.yunda51.com/?p=2016</guid>
		<description><![CDATA[我的PHP版本为PHP8.3，nginx版本为1.25，所以官方默认下载4.0版本 1、首先安装JWT扩展包：<a href="https://www.yunda51.com/?p=2016" class="read-more">Continue Reading</a>]]></description>
				<content:encoded><![CDATA[<p>我的PHP版本为PHP8.3，nginx版本为1.25，所以官方默认下载4.0版本<br />
1、首先安装JWT扩展包：这里安装的4.0的，其他版本请查看JWT官网：<a href="https://jwt.io/libraries">https://jwt.io/libraries</a></p>
<pre class="wp-code-highlight prettyprint">
composer require lcobucci/jwt
</pre>
<p>2、封装类：JwtUtil.php<br />
在项目http目录下创建JwtAuth目录，并创建JwtUtil.php文件</p>
<pre class="wp-code-highlight prettyprint">
&lt;?php
namespace App\Http\JwtAuth;

use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;

/**
 * 单例模式
 * Class JwtUtil
 * @package App\JwtAuth\JwtUtil
 */
class JwtUtil
{
    private $config;
    private $key = &quot;Ge1KCTRhdVsmUUZY0GrwgEvLubPvLOCM&quot;;
    private $iss = &quot;tpxhm.com&quot;;//颁发者(iss声明)
    private $aud = &quot;tpxhmauth.com&quot;;//访问群体(aud声明)
    private $jti = &quot;5t6y9400453&quot;; //id（jti声明）
    private $expTime = 1;//令牌有效时间,单位小时
    private static $instance;// 单例模式JwtAuth句柄

    // 获取JwtAuth的句柄
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    /**
     * 构造
     */
    public function __construct()
    {
        self::init();
    }

    /**
     * 初始化
     */
    private function init()
    {
        $config = Configuration::forSymmetricSigner(
            new Sha256(),
            InMemory::base64Encoded($this-&gt;key)
        );
        $this-&gt;config = $config;
    }

    /**
     * 创建JWT
     * @param array $arrClaim
     * @return string
     * @throws \Exception
     * @author 简忆博客
     */
    public function createToken(array $arrClaim)
    {
        $config = $this-&gt;config;
        assert($config instanceof Configuration);
        if (is_array($arrClaim) &amp;&amp; count(array_filter(array_keys($arrClaim),&#039;is_string&#039;))&gt;0) {
            //是关联数组
        } else {
            //不是关联数组
            throw new \Exception(&quot;claim参数必须为关联数组&quot;);
        }

        $now = new \DateTimeImmutable();

        $token = $config-&gt;builder()
            // 配置颁发者（iss声明）
            -&gt;issuedBy($this-&gt;iss)
            // 配置访问群体（aud声明）
            -&gt;permittedFor($this-&gt;aud)
            // 配置id（jti声明）
            -&gt;identifiedBy($this-&gt;jti)
            // 配置令牌发出的时间（iat声明）
            -&gt;issuedAt($now)
            // 配置令牌的过期时间（exp claim）
            -&gt;expiresAt($now-&gt;modify(&quot;+{$this-&gt;expTime} hour&quot;));
        //claim
        foreach ($arrClaim as $k =&gt; $item) {
            $token = $token-&gt;withClaim($k, $item);
        }
        // 生成新令牌
        $token = $token-&gt;getToken($config-&gt;signer(), $config-&gt;signingKey());
        return $token-&gt;toString();
    }

    /**
     * 解析token
     * @param string $jwt
     * @return mixed
     * @author 简忆博客
     */
    public function parseToken(string $jwt)
    {
        $config = $this-&gt;config;
        $token = $config-&gt;parser()-&gt;parse($jwt);
        return $token-&gt;claims();
    }


    /**
     * 验证令牌
     * @param $jwt
     * @return mixed
     * @throws \Exception
     * @author 简忆博客
     */
    public function validatorToken($jwt)
    {
        $config = $this-&gt;config;
        $token = $config-&gt;parser()-&gt;parse($jwt);
        $claims = $token-&gt;claims();
        $jti = (string)$claims-&gt;get(&#039;jti&#039;);
        $iss = (string)$claims-&gt;get(&#039;iss&#039;);
        $aud = $claims-&gt;get(&#039;aud&#039;);
        $exp = $claims-&gt;get(&#039;exp&#039;);
        $now = new \DateTimeImmutable();
        // 是否过期
        if ($exp &lt; $now) {
            throw new \Exception(&quot;身份已过期&quot;);
        }
        //验证jwt id是否匹配
        $validate_jwt_id = new \Lcobucci\JWT\Validation\Constraint\IdentifiedBy($jti);
        // 验证签发人url是否正确
        $validate_issued = new \Lcobucci\JWT\Validation\Constraint\IssuedBy($iss);
        // 验证客户端url是否匹配
        $validate_aud = new \Lcobucci\JWT\Validation\Constraint\PermittedFor($aud[0]);
        $config-&gt;setValidationConstraints($validate_jwt_id, $validate_issued, $validate_aud);
        $constraints = $config-&gt;validationConstraints();
        //验证
        if (!$config-&gt;validator()-&gt;validate($token, ...$constraints)) {
            throw new \Exception(&quot;非法的请求&quot;);
        }
        return $claims;
    }
}
</pre>
<p>3、创建middleware中间件</p>
<pre class="wp-code-highlight prettyprint">
&lt;?php
namespace App\Http\Middleware;
use App\Http\JwtAuth\JwtUtil;
use App\Http\Response\ApiErrDesc;
use App\Http\Response\ResponseJson;
use Closure;
use Illuminate\Http\Request;

class CheckLogins
{
  use ResponseJson;

  /**
   * Handle an incoming request.
   *
   * @param \Illuminate\Http\Request $request
   * @param \Closure $next
   * @return mixed
   */
  public function handle(Request $request, Closure $next)
  {
    $token =!empty($_SERVER[&#039;HTTP_TOKEN&#039;]) ? $_SERVER[&#039;HTTP_TOKEN&#039;] : &#039;&#039;;
    if ($token) {
      //检验token
      $jwtAuth = JwtUtil::getInstance();
      $jwtAuth = $jwtAuth-&gt;validatorToken($token);
      if($jwtAuth){
        return $next($request);
      }else {
        return $this-&gt;jsonData(ApiErrDesc::EXPIRES_TIME[0], ApiErrDesc::EXPIRES_TIME[1]);
      }
    } else {
      return $this-&gt;jsonData(ApiErrDesc::LOGIN_TOKEN[0], ApiErrDesc::LOGIN_TOKEN[1]);
    }

  }
}
</pre>
<p>4、创建登录控制器：LoginController.php</p>
<pre class="wp-code-highlight prettyprint">
&lt;?php
namespace App\Http\Controllers\Admin;

use App\Http\JwtAuth\JwtUtil;
use App\Http\Response\ApiErrDesc;
use App\Http\Controllers\Controller;
use App\Http\Requests\Api\CheckCaptcha;
use App\Http\Response\ResponseJson;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class LoginController extends Controller
{
  use ResponseJson;
  /*
   * 用户登录
   *
   * @param Request $request
   * @return false|string
   * */
  public function login(Request $request){
    //获取客户端传递的参数
    $name = $request-&gt;input(&#039;username&#039;);
    $password = $request-&gt;input(&#039;password&#039;);
    try {
      //去数据库中查询改用户信息
      $res=DB::table(&#039;sys_admin&#039;)-&gt;where(array(&#039;name&#039;=&gt;$name,&#039;stop&#039;=&gt;0))-&gt;first();
      if(!$res){
        return $this-&gt;jsonData(ApiErrDesc::NO_USER[0],ApiErrDesc::NO_USER[1]);
      }
    }catch (\Illuminate\Database\QueryException $exception){
      return $this-&gt;jsonData(ApiErrDesc::ERROR[0],$exception-&gt;getMessage());
    }

    //password_hash()
    $userPasswordHash = $res-&gt;password;
    if(!password_verify($password,$userPasswordHash)){
      return $this-&gt;jsonData(ApiErrDesc::ERR_PASSWORD[0],ApiErrDesc::ERR_PASSWORD[1]);
    }
    //验证成功，生成jwt返回
    $token = JwtUtil::getInstance()-&gt;createToken([&#039;uid&#039; =&gt; $res-&gt;id]);

    //登录成功
    return $this-&gt;jsonData(ApiErrDesc::LOGIN_SUCCESS[0],ApiErrDesc::LOGIN_SUCCESS[1],$token);
  }
}
5、查询用户信息
&lt;?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;

use App\Http\JwtAuth\JwtAuth;
use App\Http\JwtAuth\JwtUtil;
use App\Http\Response\ApiErrDesc;
use App\Http\Response\ResponseJson;

class PictureController extends Controller
{
  use ResponseJson;
  public function info(){
    //检验token
    $token =!empty($_SERVER[&#039;HTTP_TOKEN&#039;]) ? $_SERVER[&#039;HTTP_TOKEN&#039;] : &#039;&#039;;
    if (!$token){
      return $this-&gt;jsonData(ApiErrDesc::LOGIN_TOKEN[0], ApiErrDesc::LOGIN_TOKEN[1]);
    }
    $jwtAuth = JwtUtil::getInstance();
    $claims = $jwtAuth-&gt;validatorToken($token);
    //得到用户id
    $uid = $claims-&gt;get(&#039;uid&#039;);

    $user = DB::table(&#039;sys_admin&#039;)-&gt;where(&#039;id&#039;,$uid)-&gt;first();
    if(!$user){
      return $this-&gt;jsonData(ApiErrDesc::NO_USER[0],ApiErrDesc::NO_USER[1]);
    }
  }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>https://www.yunda51.com/?feed=rss2&#038;p=2016</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Laravel配置路由出现404解决办法</title>
		<link>https://www.yunda51.com/?p=1771</link>
		<comments>https://www.yunda51.com/?p=1771#comments</comments>
		<pubDate>Thu, 25 May 2017 09:46:27 +0000</pubDate>
		<dc:creator><![CDATA[运达]]></dc:creator>
				<category><![CDATA[php技术]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://www.yunda51.com/?p=1771</guid>
		<description><![CDATA[环境：Lnmp（nginx+php+mysql） 今天在搭建Laravel框架的时候访问显示空白页： 解决如下<a href="https://www.yunda51.com/?p=1771" class="read-more">Continue Reading</a>]]></description>
				<content:encoded><![CDATA[<p>环境：Lnmp（nginx+php+mysql）<br />
今天在搭建Laravel框架的时候访问显示空白页：<br />
解决如下：</p>
<pre class="wp-code-highlight prettyprint">
cd laravel
chmod -R 777 storage
</pre>
<p><strong>在配置Laravel路由的时候报了404错误</strong><br />
首先分析下问题：一般出现这种情况的都是apache或者nginx配置出现问题</p>
<p>nginx解决办法</p>
<p>    在location里面加上　try_files $uri $uri/ /index.php?$query_string;</p>
<p>    如果配置文件中存在　try_files $uri $uri/ =404;需要将它注释掉或者删掉，否则会报错</p>
<p><strong>鄙人的nginx配置如下：</strong></p>
<pre class="wp-code-highlight prettyprint">
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
#   include       /app/soft/nginx/conf/vhost/*.conf;
    default_type  application/octet-stream;
    client_max_body_size 50m;
    client_header_buffer_size 50M;
    large_client_header_buffers 4 50M;
    log_format main &#039;$server_name $remote_addr - $remote_user [$time_local] &quot;$request&quot; &#039;
    &#039;$status $body_bytes_sent &quot;$http_referer&quot; &#039;
    &#039;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot; &#039;
    &#039;$ssl_protocol $ssl_cipher $upstream_addr $request_time $upstream_response_time&#039;;
    sendfile        on;
    keepalive_timeout  65;

server {
        listen       80;
        server_name  localhost;
        send_timeout 60;

        location / {
            root   /app/www/laravel/public;
            access_log  /app/log/access.log;
            error_log   /app/log/error.log debug;
	    try_files $uri $uri/ /index.php?$query_string; 
            index  index.php index.html index.htm;

        }

        location ~ \.php$ {
        root   /app/www/laravel/public;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffers 8 128k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
        include        fastcgi_params;
        }
    }
</pre>
<p>这样就ok了，现在可以开启你的laravel模式了~~</p>
]]></content:encoded>
			<wfw:commentRss>https://www.yunda51.com/?feed=rss2&#038;p=1771</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
