2019-03-03 11:50:05
围观(35944)
在没有使用Laravel之前一直都是写的原生PHP,主要是觉得不能太过依赖框架。但使用Laravel之后一切都变得美好、优雅。
使用原生不依赖任何框架,也不依赖任何的扩展、包。所以要认证API只能是在用户表中加入Token字段,还要加入Token生成时间或者过期时间字段用于验证。
而jwt-auth(Json Web Token) 无需将token存入字段,因为生成Token的时候已经将这些信息包含在Token中。
刚开始接触jwt-auth当然是看官方文档,在Github上的官方文档:https://github.com/tymondesigns/jwt-auth/wiki
官网网站:http://jwt-auth.com/
如果Laravel版本是5.6或者5.7跟着官方文档安装,会发现安装出错,即使不报错也会无法生成jwt.php文件。后来查阅了一些资料才得以解决。
安装jwt
当然需要先安装Laravel,然后配置好环境及域名(配置方法可看www.bubaijun.com/page.php?id=118 有一段写了配置方法)然后执行代码
composer require tymon/jwt-auth 1.*@rc
然后直接发布配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
发布成功后生成密钥
php artisan jwt:secret
这时候再回头来注册Facade (config/app.php文件) 在aliases数组里添加两行代码
'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth', 'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory',
然后修改config/auth.php配置文件
将api数组的driver值token改为jwt
'api' => [ 'driver' => 'jwt', //这里原来是token 'provider' => 'users', ],
接下来就是修改User模型
需要引入一个类
use Tymon\JWTAuth\Contracts\JWTSubject;
类名后面添加JWTSubject接口
class User extends Authenticatable implements JWTSubject
然后新增两个函数
public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; }
User模型完整代码
namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Tymon\JWTAuth\Contracts\JWTSubject; class User extends Authenticatable implements JWTSubject { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; } }
新建路由群组(routes/api.php)
Route::group([ 'prefix' => 'auth' ], function ($router) { Route::post('login', 'AuthController@login'); Route::post('logout', 'AuthController@logout'); Route::post('me', 'AuthController@me'); });
根据路由定的控制器 需要生成这个控制器
php artisan make:controller AuthController
在控制器顶部引入Auth类
use Illuminate\Support\Facades\Auth;
在控制器内写一个构造方法 用于中间件验证
public function __construct() { $this->middleware('auth:api', ['except' => ['login']]); }
根据定义路由的时候就可知 有一个login路径,是用于登录获取Token,所以写一个login函数
public function login() { $credentials = request(['email', 'password']); //验证邮箱及密码 如果不存在则直接返回错误信息 if (! $token = auth('api')->attempt($credentials)) { return response()->json(['error' => 'User does not exist or password error'], 400); } //验证成功则直接返回Token 这里的respondWithToken是自定义函数 用于生成Token return $this->respondWithToken($token); }
此时需要写一个生成Token的函数respondWithToken
public function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('api')->factory()->getTTL() * 60 ]); }
有登录生成Token必然就有退出登录销毁Token,所以写一个logout函数用于退出
public function logout() { auth('api')->logout(); return response()->json(['status' => 200, 'message' => 'Exit successfully']); }
此时已经能够登录获取Token并退出,再写一个函数me获取用户信息。
public function me() { return response()->json(auth('api')->user()); //如果要获取用户ID可以这样 // return response()->json(auth('api')->id()); }
接下来就是使用Postman测试这些接口,由于此时并没有user数据表,也没有可用的用户数据用于登录。所以需要执行在env文件配置好数据库,然后执行代码
php artisan make:auth
然后执行数据迁移
php artisan migrate
如果报错则修改app/Providers/AppServiceProvider.php
在顶部加一行代码
use Illuminate\Support\Facades\Schema;
然后在boot函数加入
Schema::defaultStringLength(191);
再把数据库里的数据表删除,重新执行数据迁移
php artisan migrate
为了测试方便,打开配置好的域名注册一个账号。
注册完成后打开Postman,输入域名及账号邮箱和密码发起请求。
比如 www.token.test/api/auth/login 因为api.php这个路由配置里的路由都是带api前缀的。所以在auth前加一个/api
可见已经返回了一个Token,再尝试获取用户数据的接口www.token.test/api/auth/me,请求这个接口就需要在请求头带上Token,请求头Token的key是Authorization。还有Token值前需要带上bearer
最后退出销毁Token
接口:www.token.test/api/auth/logout 和获取信息时一样,需要带上Token
此时再使用获取用户数据的接口也无效。整个过程结束了。
另外说一下,如果没有PHP和Laravel基础看此文可能会比较难懂,当然 主要是我也没细写😐😐...
最近在写一个小程序的开源,对的,就是“坦白言”开源😳,之前有写文章记录下运维情况,而现在用户量死在了当时的6W+ 已经没人使用了。
有兴趣可看这两篇文章
www.bubaijun.com/page.php?id=113
www.bubaijun.com/page.php?id=112
由于时间紧迫,开源的代码质量应该一般,虽然公司项目不多,但每天都在自学。所以开源的代码后续再慢慢优化了。
开源的是小程序前端及后端,后端用Laravel框架。配置一下.env搭建在服务器就能直接用这套程序了。
未完待续,敬请期待...
本文地址 : bubaijun.com/page.php?id=121
版权声明 : 未经允许禁止转载!
上一篇文章: 使用Laravel发送HTTP请求第三方API
下一篇文章: 使用Laravel发送邮件