Laravel访问鉴权-api路由-token

我司前后端分离,所有的服务器端工程都是在开发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');
}

猜你喜欢

转载自www.cnblogs.com/zhaoxizhe/p/11308128.html