开发过程
参考教程和文档
https://laravelacademy.org/post/3640.html
https://laravel-china.org/articles/10885/full-use-of-jwt
集成JWT到Laravel 5
安装
我们使用Composer安装jwt扩展包:
composer require tymon/jwt-auth 1.0.*
配置
安装完成后,需要在config/app.php中注册相应的服务提供者:
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class
然后注册需要用到的对应门面:
'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
建立用户模型
利用自带的User实现继承和接口extends Authenticatable implements AuthenticatableUserContract
修改 auth.php
config/auth.php
'api' => [
'driver' => 'jwt', // 原来是 token 改成jwt
'provider' => 'users',
],
注册一些路由
创建 token 控制器
php artisan make:controller AuthController
注册实现
public function register(Request $request)
{
//check
$input['name'] = $request->get('name');
if ($user = User::where($input)->first()) {
return "用户名已经被注册";
}
//formal register now
$input['name'] = $request->get('name');
$input['email'] = $request->get('email');
$input['password'] = md5($request->get('password', '1234567890'));
$input['init']=0;
User::create($input);
return response()->json(['result' => true]);
}
登陆实现
public function login(Request $request)
{
Config::set('jwt.user', "App\Models\Admin");
Config::set('auth.providers.users.model', \App\Models\Admin::class);
$input['name'] = $request->get('name');
$input['password'] = md5($request->get('password'));
if ($user = User::where($input)->first()) {
$token = JWTAuth::fromUser($user);
$this->send($user['name'],$user['email'],$token);
$user->init++;
$user->save();
} else {
return response()->json(['result' => '账号或密码错误.']);
}
return view('profile')->with(['user'=>$user,'token'=>$token]);
}
邮件通知
在Controller中增加函数send
public function send($name,$email,$token)
{
date_default_timezone_set('Asia/Shanghai');
$time=date('y-m-d h:i:s',time());
$para=['name'=>$name,'token'=>$token,'email'=>$email,'time'=>$time];
$view=new UserWelcome();
$view=$view->build($para);
Mail::send($view,$para,function($message){
$to = 'Target Mail addr';
$message ->subject('Your subject name')->to($to);
});
return "finish";
}
新建class UserWelcome extends Mailable
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class UserWelcome extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build($para=[])
{
return $this->markdown('emails.welcome',$para);//
}
}
然后我们在emails目录下面新建一个emails.welcome.blade.php
文件
@component('mail::message')
Your Information
@endcomponent
初次登陆认证
数据库中新建了一个init字段就可以了,登陆时判断或者修改值即可。
大体步骤如上
开发小插曲
- 用PhpStorm的时候对于一些JWTAuth类的函数的提示不够友好例如JWTAuth::parseToken()提示找不到该函数,但是最后运行是可以调用的。
安装配置完laravel-ide-helper应该就没问题了。 - laravel的mail中,使用126邮箱的SMTP发送较大(若干MB)的文件,会返回一个在126官方API文档中提示垃圾邮件拦截的错误,导致邮件发送失败。(而且如果多次发送同一个内容相同的邮箱,也会报相应的错误)
- 在
localhost:8000
可以访问的laravel实例,在127.0.0.1:8000
无法访问
查看了一下localhost的解析为:::1,网上有说这是ipv6的解析,需要改回来才能使用,但是无果。。
- @component('mail::message')这个模板组件在手机端中的适配做的貌似不是很好。(手机中查看时分辨率不匹配qwq)