简介
Json web token (JWT)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
构成
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
安装
composer require tymon/jwt-auth 0.5.*
配置
在config/app.config 的 providers中注册服务提供者:
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class
然后在aliases中注册需要用到的对应门面:
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class
然后发布相应配置文件:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
最后生成密钥:
php artisan jwt:generate
使用
1,登录授权
public function login(Request $request)
{
//验证
$validate = \Validator::make($request->all(),[
'phone' => 'required|string|mobile|max:255|exists:users',
'password' => 'required|string|min:6'
],[],[
'phone' => '手机号',
'password' => '密码有误'
]);
if($validate->fails()){
return $this->fail(ApiCode::PARAM_ERROR,$validate->errors()->first());
}
//手动登录
if(\Auth::attempt(['phone'=>$request->get('phone'),'password'=>$request->get('password')])){
$token = JWTAuth::fromUser(Auth::user());
$user_id = Auth::user()['id'];
return $this->success('登录成功!',compact('token'));
}else{
return $this->fail(ApiCode::AUTH_FAIL,'验证失败!');
}
}
2,路由中间件
对需要jwt认证授权的接口加上jwt.auth中间件。
若需要jwt 生成的token每次都刷新,只需加上jwt.refresh中间件即可。
3,用户token认证
用户登录成功之后,下一步就是发送一个包含token的请求来获取用户信息。
要通过http发送一个需要认证通过的请求,需要设置Authorization头:
Authorization: Bearer {yourtokenhere}
或者直接在http请求地址后面加上token参数
http://192.168.0.147/partner/test?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjEwMDU2LCJpc3MiOiJodHRwOi8vMTkyLjE2OC4wLjE0Ny9sb2dpbiIsImlhdCI6MTUwMzY1NTY0MywiZXhwIjoxNTAzNjU5MjQzLCJuYmYiOjE1MDM2NTU2NDMsImp0aSI6Im9Zb0Z5d01ybEdFU3BKTGIifQ.JSiVFeVPLsmrqu9B1Suquz-P5HubyXsvHIIiy0-63H8&val1=1&val2=2
4,token 过期刷新
jwt token 过期时间在jwt.config 中设置
ttl 表示token过期时间。
refresh_ttl 表示token过期后有效的刷新时间。
刷新token代码如下:
public function refresh(Request $request)
{
$oldToken = JWTAuth::getToken();
if(!$oldToken){
return $this->fail(ApiCode::PARAM_ERROR,'您的token有误!');
}
$token = JWTAuth::refresh($oldToken);
return $this->success('刷新成功!',['token'=>$token]);
}
参考
http://www.jianshu.com/p/576dbf44b2ae
http://laravelacademy.org/post/3640.html