我司前后端分离,所有的服务器端工程都是在开发API,本文列出详细的实现步骤,给不熟悉Laravel的同学们参考。
基本操作
1、数据库表结构调整
在user表中,增加这样的代码
Schema::table('users', function ($table) { $table->string('api_token', 80)->after('password') ->unique() ->nullable() ->default(null); });
2、为用户生成api_token,并加密存储
由于前后端分离,因此api_token的创建和返回,只能是在用户登录的时候。于是:
定义一个api路由,user/login
Route::post('/user/login', 'Api\UserController@login');
创建一个controller,App/Http/Controllers/Api/UserController,在login方法中,保存加密过的api_token,并将未加密的api_token返回给请求者。
<?php namespace App\Http\Controllers\Api; use Illuminate\Http\Request; use App\Http\Controllers\HOBaseController; use App\Http\Requests\UserLoginRequest; use App\Http\Models\User; use Illuminate\Support\Str; class UserController extends HOBaseController { // public function login(UserLoginRequest $request) { $validated = $request->validated(); $user = User::where('name', $request->username) ->where('password', $request->password) ->first(); if(null == $user){ $this->error()->incorrectUsernameOrPassword(); } $token = Str::random(60); $user->api_token = hash('sha256', $token); $user->save(); return $this->response($token); } }
在config/auth.php文件中,把api这个guard的hash属性,设置为“true”
'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => true, ],
3、路由保护
用auth:api来保护所有的api路由(login路由除外)
Route::middleware('auth:api')->post('/test', 'Api\TestController@test');
4、鉴权失败后的重定向
创建一个新的路由,起个名字叫做“unauthenticated”,我们把它放在UserController里面,并创建对应的方法unauthenticated,用来返回提示信息给用户。
Route::post('/user/unauthenticated', 'Api\UserController@unauthenticated')->name('unauthenticated');
public function unauthenticated(Request $request) { $this->error()->unauthenticated(); }
App/Http/Middleware/Authenticate.php文件中,修改redirectTo。当用户的authentication没有被通过的时候,本次访问会被重定向到指定的路由。对于api访问来说,这个情况我们应该返回一个错误信息给用户,告知其本次无权进行本次访问,请重新获取token.
protectedfunction redirectTo($request){
return route('unauthenticated'); }