资讯专栏INFORMATION COLUMN

laravel5.5+dingo+JWT开发后台API

printempw / 1847人阅读

摘要:我的博客中文文档中使用辅助文章参考这篇文章基本就能搭建出环境,我使用的版本跟他一样,不知道别的版本有啥大的区别,但是网上找的其他一些文章使用的是旧的版本,封装的东西路径可能不一样,可能会保错,有些文档还说要手动添加和,其实新版本不需要。

我的github博客:https://zgxxx.github.io/

dingo api 中文文档: https://www.bookstack.cn/read...
Laravel中使用JWT:https://laravel-china.org/art...
辅助文章: https://www.jianshu.com/p/62b...

参考https://www.jianshu.com/p/62b... 这篇文章基本就能搭建出环境,我使用的版本跟他一样 "dingo/api": "2.0.0-alpha1","tymon/jwt-auth": "^1.0.0-rc.1",不知道别的版本有啥大的区别,但是网上找的其他一些文章使用的是旧的版本,jwt封装的东西路径可能不一样,可能会保错,有些文档还说要手动添加TymonJWTAuthProvidersLaravelServiceProvider::class和DingoApiProviderLaravelServiceProvider::class,其实新版本不需要。
1. composer.json引入包,执行composer update:
  "require": {
    ......
    "dingo/api": "2.0.0-alpha1",
    "tymon/jwt-auth": "^1.0.0-rc.1"
  },
2. 执行下面两个语句自动生成dingo和jwt的配置文件:
php artisan vendor:publish --provider="DingoApiProviderLaravelServiceProvider"
//config文件夹中生成dingo配置文件---> api.php
php artisan vendor:publish --provider="TymonJWTAuthProvidersLaravelServiceProvider"
//config文件夹中生成dingo配置文件---> jwt.php
3. 配置 .env

具体配置可参考 文档https://www.bookstack.cn/read... ,我的配置是

API_STANDARDS_TREE=vnd
API_PREFIX=api
API_VERSION=v1
API_DEBUG=true
API_SUBTYPE=myapp 

还需在命令行执行 php artisan jwt:secret,会在.env自动添加JWT_SECRET,其他若需要,可以到各种的配置文件中看,在.env添加即可

4. 关键处理
"defaults" => [
        "guard" => "web",
        "passwords" => "users",
    ],

    "guards" => [
        "web" => [
            "driver" => "session",
            "provider" => "users",
        ],

        "api" => [
            "driver" => "jwt", 
            "provider" => "users",
        ],
    ],

这里需要把api原本的driver => session 改为使用jwt机制,provider对应你要用的用户认证表,一般就是登录注册那张表

getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims() {
        return [];
    }
}
5. 设置控制器

考虑到可能后面需要开发不同版本api,所以在app/Http/Controller下建立了V1,V2目录,根据你自己的需求来,只要写好命名空间就ok

middleware("refresh", ["except" => ["login","register"]]);
    }

    public function test(){
        echo "test!!";
    }

    public function register(Request $request)
    {

        $rules = [
            "name" => ["required"],
            "email" => ["required"],
            "password" => ["required", "min:6", "max:16"],
        ];

        $payload = $request->only("name", "email", "password");
        $validator = Validator::make($payload, $rules);

        // 验证格式
        if ($validator->fails()) {
            return $this->response->array(["error" => $validator->errors()]);
        }

        // 创建用户
        $result = User::create([
            "name" => $payload["name"],
            "email" => $payload["email"],
            "password" => bcrypt($payload["password"]),
        ]);

        if ($result) {
            return $this->response->array(["success" => "创建用户成功"]);
        } else {
            return $this->response->array(["error" => "创建用户失败"]);
        }

    }

    /**
     * Get a JWT token via given credentials.
     *
     * @param  IlluminateHttpRequest  $request
     *
     * @return IlluminateHttpJsonResponse
     */
    public function login(Request $request)
    {
        $credentials = $request->only("email", "password");

        if ($token = $this->guard()->attempt($credentials)) {
            return $this->respondWithToken($token);
        }

        return $this->response->errorUnauthorized("登录失败");
    }

    /**
     * Get the authenticated User
     *
     * @return IlluminateHttpJsonResponse
     */
    public function me()
    {
        //return response()->json($this->guard()->user());
        return $this->response->array($this->guard()->user());
    }

    /**
     * Log the user out (Invalidate the token)
     *
     * @return IlluminateHttpJsonResponse
     */
    public function logout()
    {
        $this->guard()->logout();

        //return response()->json(["message" => "Successfully logged out"]);
        return $this->response->array(["message" => "退出成功"]);
    }

    /**
     * Refresh a token.
     *
     * @return IlluminateHttpJsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken($this->guard()->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return IlluminateHttpJsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            "access_token" => $token,
            "token_type" => "bearer",
            "expires_in" => $this->guard()->factory()->getTTL() * 60
        ]);
    }

    /**
     * Get the guard to be used during authentication.
     *
     * @return IlluminateContractsAuthGuard
     */
    public function guard()
    {
        return Auth::guard($this->guard);
    }
}
控制器中命名空间namespace需要设置好,路由的时候需要用到, 
$this->middleware("refresh", ["except" => ["login","register"]]);
这里的中间件使用的是网上找的,用于无痛刷新jwt的token,具体可以参考这篇文章:https://www.jianshu.com/p/9e9...
6. refresh中间件
checkForToken($request);

        // 使用 try 包裹,以捕捉 token 过期所抛出的 TokenExpiredException  异常
        try {
            // 检测用户的登录状态,如果正常则通过
            if ($this->auth->parseToken()->authenticate()) {
                return $next($request);
            }
            throw new UnauthorizedHttpException("jwt-auth", "未登录");
        } catch (TokenExpiredException $exception) {
            // 此处捕获到了 token 过期所抛出的 TokenExpiredException 异常,我们在这里需要做的是刷新该用户的 token 并将它添加到响应头中
            try {
                // 刷新用户的 token
                $token = $this->auth->refresh();
                // 使用一次性登录以保证此次请求的成功
                Auth::guard("api")->onceUsingId($this->auth->manager()->getPayloadFactory()->buildClaimsCollection()->toPlainArray()["sub"]);
            } catch (JWTException $exception) {
                // 如果捕获到此异常,即代表 refresh 也过期了,用户无法刷新令牌,需要重新登录。
                throw new UnauthorizedHttpException("jwt-auth", $exception->getMessage());
            }
        }

        return $next($request)->withHeaders([
                "Authorization"=> "Bearer ".$token,
            ]);
    }
}
写好中间件后需要在app/Http/Kernel.php中注入
protected $routeMiddleware = [
​ ......
​ "refresh" => RefreshToken::class,
];
7. routes/api.php 设置路由
$api = app("DingoApiRoutingRouter");
$api->version("v1", ["namespace" => "AppHttpControllersV1"], function ($api) {
    $api->post("register", "AuthController@register");
    $api->post("login", "AuthController@login");
    $api->post("logout", "AuthController@logout");
    $api->post("refresh", "AuthController@refresh");
    $api->post("me", "AuthController@me");
    $api->get("test", "AuthController@test");
});
这里有个坑,不要这样写$api->post("me",["middleware" =>"refresh"], "AuthController@me");
这样虽然能执行这个中间件但执行到$next($request)这里会出错,貌似是一个回调报错 Function name must be a string ,不太清楚具体原因,可以这样写$api->post("me",, "AuthController@me")->middleware("refresh");

根据以上几个步骤就可以建立起简单的api后台基础,获取api路由列表可以使用命令行:
php artisan api:routes
routes:list貌似无法显示以上api路由,需要在api.php那里再写一遍原始的laravel路由定义才可以显示:比如这样Route::post("api/test", "AuthController@test");后续会用另一篇幅来记录postman和小程序相关知识,可以关注我的博客:https://zgxxx.github.io

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29608.html

相关文章

  • Laravel从零开发后台API(二)

    摘要:之前我们已经准备好了基本的安装过程现在我们去实现一下具体的业务部分用户的登录与注册对于用户注册这对于一款应用来说再正常不过了为了接下来我们的效果我们可以去生成一个即在项目终端执行生成用户之后我们暂时先不去编辑字段后面我们需要用到时再加返回字 之前我们已经准备好了基本的安装过程 现在我们去实现一下具体的业务部分 用户的登录与注册 对于用户注册 这对于一款应用来说再正常不过了 为了接下来...

    Nekron 评论0 收藏0
  • laravel 5.4 + dingo api + jwt 代替Passport

    摘要:前言由于在度娘找了半天根本一大堆版本,弄得我死去活来的,每个都试了一堆问题,到底你们做完有没有总结过一次然后有几个使用,完全不行啊,太监版不是我想要的。后来,终于找到例子并实测成功。 前言 由于在度娘找了半天根本一大堆Copy版本,弄得我死去活来的,每个都试了一堆问题,到底你们做完有没有总结过一次?然后有几个使用lunmen+dingo api+jwt,完全不行啊,太监版不是我想要的。...

    _Zhao 评论0 收藏0
  • 使用postman调试jwt开发的接口

    摘要:我的博客上一篇博客文章介绍了使用开发的几个步骤,那么在实际操作中,我们需要测试设置了这几个路由,对应的类似这样使用来调试这些。检查此次请求中是否带有,如果没有则抛出异常。 我的github博客:https://zgxxx.github.io/ 上一篇博客文章https://segmentfault.com/a/11... 介绍了laravel使用dingo+jwt开发API的几个步骤...

    dingding199389 评论0 收藏0
  • laravel5.5 + jwt-auth 1.0.0-rc.2 多表多种用户认证规式

    摘要:在下新建无效无效然后在的下添加自定义的跨域中间键在路由和下的构造函数调用。免责由于时间关系,没有在截图了,参考此文章的小伙伴自行进行测试下面例子源用了很多文档代码 安装 composer create-project --prefer-dist laravel/laravel sample 5.5.* 安装依赖 composer install 安装jwt-auth compos...

    tangr206 评论0 收藏0

发表评论

0条评论

printempw

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<