laravel 开发RestFul接口【二、集成三方扩展 - jwt】

网友投稿 660 2022-11-07

laravel 开发RestFul接口【二、集成三方扩展 - jwt】

laravel 开发RestFul接口【二、集成三方扩展 - jwt】

在web开发中通常是使用session 来保持会话,在app接口开发中则是用携带token来保持会话!这里涉及到一个常见的面试题,如果客户端禁掉cookie,session 是否有用? 答案:肯定的! 只要你有办法带上自己sessionid 去服务端验证都是可以达到同样多的效果 在开发api也是同样只不过稍微麻烦一点需要自己来实现这么一套会话机制 文中第八点具体讲解遇到一些问题如何处理请细心看下

接下来用jwt来实现认证 1、安装jwt

composer require tymon/jwt-auth:dev-develop --prefer-source

2、加入服务 在config/app 的providers中添加

Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,

3、添加门面(可以理解为别名)在config/app 的aliases中添加

'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,

4、生成jwt 的配置文件

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

5、生成JWT_SECRET

php artisan jwt:generate

这里如果 在生成密钥时报的一个错误

Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() does not exist

导致这个的原因是因为jwt版本与laravel版本冲突 这时候我们只需要找到config/app.php下的这一段代码删除掉Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class 然后执行命令composer require tymon/jwt-auth:dev-develop --prefer-source第二步将Tymon\JWTAuth\Providers\LaravelServiceProvider::class加入config/app.php的 'providers'数组里面中最后执行php artisan jwt:secret

6、开发登入注册接口 初始化数据库这里我用已经提供好的users表,方法就不赘述了 添加如下接口 待会会用到

$api = app('Dingo\Api\Routing\Router');// 配置api版本和路由$api->version('v1', ['namespace' => 'App\Http\Controllers\Api\V1\Controller'], function ($api) { $api->group(['middleware' => ['jwt.api.auth','jwt.refresh'], 'providers' => 'jwt'], function ($api) { $api->post("testAuth", 'UserController@testAuth'); }); $api->post("reg", 'UserController@reg'); $api->post("login", 'UserController@login'); $api->get("test/{id}/{name}", 'RestFulController@test')->name("getinfo");});

创建User控制器

all(); $res = User::create([ 'nikename' => $data['nikename'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); $token = JWTAuth::fromUser($res); return $this->response->array($token); } public function login(Request $request){ $credentials = $request->only('nikename', 'password'); try { if (! $token = JWTAuth::attempt($credentials)) { return response()->json(['error' => 'invalid_credentials'], 401); } } catch (JWTException $e) { return response()->json(['error' => 'could_not_create_token'], 500); } $user = User::where('nikename', $credentials['nikename'])->first()->toArray(); return ['user'=> $user, 'token' => $token]; } public function testAuth(){ return $this->response->array(['content'=>'验证成功']); }}

接下来使用postman在测试注册接口

如果这里报错Tymon\\JWTAuth\\Providers\\JWT\\NamshiAdapter does not exist 或者同类型的IlluminateAuthAdapter和IlluminateCacheAdapter不存在请修改下面发现config/jwt.php文件中是这样的'jwt' => 'Tymon\JWTAuth\Providers\JWT\NamshiAdapter','auth' => 'Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter','storage' => 'Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter',修改为'jwt' => 'Tymon\JWTAuth\Providers\JWT\Namshi','auth' => 'Tymon\JWTAuth\Providers\Auth\Illuminate','storage' => 'Tymon\JWTAuth\Providers\Storage\Illuminate',

这一步就可以了

可以得到token 就说明成功了 下面测试登入接口

返回了用户信息和token

注意上面的的登入注册路由放在了认证组的外面

得到token以后就是认证了

测试testAuth接口

验证成功 注意这里的使用携带Authorization头信息去验证 加了Bearer 的前缀标示使用Bearer 的验证方式 我在这一步遇到了很多坑 为了让错误信息更加直观,我们需要自己定义一个验证的中间如下:

authenticate()) { return response()->json([ 'errcode' => 400004, 'errmsg' => 'user not found' ], 404); } } catch (TokenExpiredException $e) { return response()->json([ 'errcode' => 400001, 'errmsg' => 'token expired' ], $e->getStatusCode()); } catch (TokenInvalidException $e) { return response()->json([ 'errcode' => 400003, 'errmsg' => 'token invalid' ], $e->getStatusCode()); } catch (JWTException $e) { return response()->json([ 'errcode' => 400002, 'errmsg' => 'token absent' ], $e->getStatusCode()); } return $next($request); }}

在app/kernel文件中的$routeMiddleware里中注册一个中间件

'jwt.api.auth' => \App\Http\Middleware\GetUserFromToken::class, //新增注册的中间件 1 接着在路由web.php文件中修改 使用自己定义的中间件来验证····

'middleware' => ['jwt.api.auth','jwt.refresh'],  1 7.获取用户信息 修改之前的权限测试代码加上返回信息

public function testAuth(Request $request){ if (!$user = JWTAuth::parseToken()->authenticate()) { return response()->json(['user_not_found'], 404); } return $this->response->array(['content'=>'验证成功','token'=>$user]); }

好的验证成功!!!!!!!!!!!!

8.坑点

使用Authorization进行验证会抛出 token absent 这个 异常 按照官方文档上的说法是在apache的RewriteEngine On RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] 并且#LoadModule rewrite_module modules/mod_rewrite.so这一行去掉#号 另外你也可以使用url来传递token 入xxx.com?token = xxxxxxxxxxxxxxxx.xxxxxx.xxxxxxxxx

2.登入和注册能正常获得token但是验证的时候会抛出user not found异常····`这里写代码片` 1 这个就坑了,花了我一个早上的时间终于到stackoverflow找到答案 原因就是你的token 刷新后就直接进黑名单了,应该是我这个版本的一个bug 如何解决呢? 没办法只能进jwt.php 这个配置文件把黑名单关闭了 设为false就可以了

'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', false), 下面放几个链接 希望对大家解决问题有所帮助

​​http://blog.qiji.tech/archives/16054

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring bean配置单例或多例模式方式
下一篇:字体大小之px、em、rem、pt,字号详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~