本文作者:心月

app接口开发之Token的发放与验证

心月IT博客 2019-04-19
摘要:token生成之后需要发放给客户端,客户端后续的每一次app接口请求都需要先验证token,验证通过则请求继续,否则请求终止。那么,token如何发放到客户端呢?

1、token发放

    token生成之后需要发放给客户端,客户端后续的每一次app接口请求都需要先验证token,验证通过则请求继续,否则请求终止。那么,token如何发放到客户端呢?

    其实token发放给客户端很简单,就像平台的登录验证,把需要验证的信息传递给服务器,服务器接收客户端传来的登录验证信息,验证通过,服务端就生成一个token并返回给客户端。

下面通过实例来演示token的发放过程:

(继续接着token生成的案例)

新建一个user控制器,用户的token获取及后续操作都由此控制器控制

在UserController控制器中新建一个login方法,用于验证登录信息并发放token,并将此方法绑定到路由中

UserController.php代码如下:

<?php
namespace App\Http\Controllers;

use App\Http\Response\ResponseJson;
use App\User;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Http\Request;
use App\Common\Auth\JwtAuth;    //JWT token生成类

class UserController extends BaseController
{
    use ResponseJson;

    /**
     * 登录获取Token
     * @param Request $request
     * @return false|string
     */
    public function login(Request $request)
    {
        //接收用户名和密码
        $username = $request->input('username');
        $password = $request->input('password');

        //获取用户uid,在获取中验证用户的有效性
        $uid = User::getUid($username, $password);

        //uid 获取成功则生成Token返回给客户端
        if($uid){
            $JwtAuth = JwtAuth::getInstance();

            $token = $JwtAuth->setUid($uid)->encode()->getToken();

            return $this->jsonSuccessData([
                'token'=>$token
            ]);
        }

    }

    

}

UserController路径

UserController路径


login方法绑定路由

login方法绑定路由


    其中 getUid 静态方法是验证用户输入的用户名和密码,只有在用户名和密码都正确的情况下才会返回对应用户的Uid,具体的实现代码这里就不展示了。

token发放实例:

token发放实例


2、token验证

这里我们通过中间件来验证token的有效性。

    中间件:在请求和响应中间,进行请求数据的拦截处理,数据校验,并且进行逻辑处理后判断是否允许进入下一步。

在laravel中自定义中间件:

app/Http/Middleware是中间件存放的位置,现在在这个目录下新建一个 JwtMiddleware 中间件类,中间件的代码如下:

<?php
namespace App\Http\Middleware;

use App\Common\Auth\JwtAuth;
use App\Http\Response\ResponseJson;
use Closure;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
use App\Common\Err\ApiErrDesc;

class JwtMiddleware extends Middleware
{
    use ResponseJson;

    /**
     * @param Request $request
     * @param Closure $next
     * @return false|mixed|string
     */
    public function handle(Request $request, Closure $next)
    {
        $token = $request->input('token');

        if($token)
        {
            $jwtAuth = JwtAuth::getInstance();
            $jwtAuth = $jwtAuth->setToken($token);

            if ($jwtAuth->validate() && $jwtAuth->verify()){
                return $next($request);
            }else{
                return redirect()->action('UserController@tips',$this->jsonData(ApiErrDesc::ERR_TOKEN[0],ApiErrDesc::ERR_TOKEN[1], [], false));
            }
        }else{
            return redirect()->action('UserController@tips',$this->jsonData(ApiErrDesc::ERR_PARAMS[0],ApiErrDesc::ERR_PARAMS[1], [], false));
        }

    }
}

在app/Http/Kernel 类中注册中间件,在注册中间件时记得把中间件的命名空间引入进来

自定义中间件在项目中的位置

自定义中间件在项目中的位置


自定义中间件注册

自定义中间件注册


然后在路由中绑定中间件:

自定义中间件绑定路由

自定义中间件绑定路由


    所有group中绑定的方法在请求时都要先经过 JwtMiddleware 自定义中间件验证,验证不通过访问被终止。验证通过访问才能继续。


    在laravel5.6发自定义中间件中似乎return的值必须为object,否则就会报错,所以这里自定义中间件验证不通过时直接让它跳转到提示页面,由提示页面展示错误信息。


在 UserController 写一个 info 方法来获取用户名,把info绑定到中间路由中,如上图自定义中间件绑定路由。

分别传入一个刚发放的token,及一个过期的token,以及不传token看会有什么结果。


验证结果:

验证通过: 验证通过


token过期:

token过期


参数错误:

参数错误


文章版权及转载声明:

作者:心月 本文地址:http://www.xinyueseo.com/other/245.html发布于 2019-09-07
文章转载或复制请以超链接形式并注明出处心月IT博客

分享到:
赞(

发表评论

快捷输入:

    评论列表 (有 0 条评论,人围观)参与讨论