shadowfish和他的代码

vuePress-theme-reco shadowfish    2020 - 2023
shadowfish和他的代码

Choose mode

  • dark
  • auto
  • light
时间轴

shadowfish

49

Article

42

Tag

时间轴

Laravel实现Cookie+Session认证的Api开发

vuePress-theme-reco shadowfish    2020 - 2023

Laravel实现Cookie+Session认证的Api开发

shadowfish 2021-01-10 laravel

Laravel是一个非常出色的PHP全栈开发框架,如果只想要用它开发API接口,也是轻而易举。这里介绍用Laravel实现Cookie+Session认证的Api开发的方法。

注意:本文使用的Laravel版本为8.12

# 安装Laravel

首先,使用Composer安装Laravel安装器

composer global require laravel/installer

安装完毕后,使用

laravel new newProject

来生成一个新的Laravel项目。项目名newProject(文件夹名)可以自己指定。

# 部署Laravel

要访问使用Laravel编写的Api,我们需要对Nginx进行配置,具体配置可以参照以下模板进行修改

server {
    listen 80;
    server_name example.com;
    root /srv/example.com/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

要注意的是,网站root为项目文件夹下的public文件夹。

# 配置数据库

# 配置数据库连接信息

在项目根目录.env文件中修改DB_CONNECTION、DB_HOST、DB_PORT、DB_DATABASE、DB_USERNAME、DB_PASSWORD的值即可指定整个项目使用的数据库。

# 配置数据库模型

接口接受的用户数据需要在数据库中进行比对,Laravel提供了非常方便抽象的方法实现这一功能。

首先,我们对app/Models/User.php进行修改。

这个Model相当于对数据库中一张表的抽象。User表即对数据库中user表的抽象。

使用

protected $table = 'user';

来指定你数据库中存储用户数据的表名。Laravel默认已Model类名的负数形式“蛇形命名”来指定表明。如:FlightModel存储flights表的数据。

使用

public function username()
{
    return 'username';
}

来指定你表中存储用户名的字段名。同理可以指定表中存储密码的字段名。

如果不希望Laravel帮你维护表中的created_at和updated_at字段,可以使用

public $timestamps = false;

来关闭这一特性。

# 配置路由控制器

要实现API的功能,我们要实现对相应URL的请求处理。Laravel中,使用控制器Controller来实现这一功能。

使用Laravel提供的命令行指令

php artisan make:controller UserController

可以很方便地新建一个新的控制器,命名为UserController。控制器位于app/Http/Controllers内。

进入新建的UserController,在类中编写public函数即可处理API请求。

比如,我们添加一个register函数来处理注册请求

public function register(Request $request){

}

参数$request提供了API请求传入的所有数据。要实现用户注册的功能,我们首先要获取用户传入的参数

 $credentials = request(['username', 'password']);
 $encryptedPassword = bcrypt($credentials['password']);

这里将用户传入的username和password数据存入$credentials中。由于Laravel在验证用户名密码时默认会把传入的密码进行bcrypt加密后比较,因此这里我们计算bcrypt加密后的密码以待存入数据库。

接着,验证数据库中无同名用户

if (User::where('username', $request->username)->count() !== 0) {
    Log::warning('用户名已存在');
    return response()->json(
        [ 'msg' => '用户名已存在'],
        400
    );
}

通过访问UserModel提供的抽象表方法where即可对表数据进行查询。这里User::where('username', $request->username)->count()意思是筛出表中username等于传入用户名的记录,返回其数量。若已存在同名用户,我们向用户返回相应提示。

接着,我们准备插入一条新的记录。Laravel中,这一操作有非常优美的实现

$newUser = new User();
$newUser->username = $request->username;
$newUser->password = $encryptedPassword;
$newUser->save();

这里直接把新创建的newUser看作一条新的记录,并通过save方法直接插入到表中。至此,注册流程已经完成,我们只需向用户返回成功回调即可。由于我们一会要在web.php中指定路由访问路径,Laravel会自动创建session文件,向响应头添加Cookie,包含了session id,以便下次访问进行认证。

# 指定路由访问路径

在这篇教程中,我们要开发的是基于Cookie+Session进行用户认证的API,因此需要使用Laravel提供的web路由。如果要编写基于Token的API,可以使用api路由。

进入刚才创建的项目文件夹,找到routes/web.php,添加如下语句

Route::post('login', [\App\Http\Controllers\UserController::class,'login']);

这行代码指定了{BASE_NAME}/login以POST访问接口的处理会发送到UserController的login方法中,也就是我们刚才编写的方法。

至此,注册接口已经完成。

# 实现自动登录认证

那么,如何使用登录或注册时返回的Cookie进行其他接口的认证呢?Laravel其实已经为我们包办好了一切。

只要你携带登录或注册时Laravel自动返回的Cookie访问其他接口,通过Auth::user()可以直接获取到当前登录的用户信息。

public function me(Request $request)
{
	Log::debug('me',[Auth::user()]);
}

如果携带的Cookie无效或过期,那么Auth::user()返回的值为null。

OK,至此,所有使用Laravel进行基于Cookie和Session进行用户认证开发API的技术基本已经讲解了,接下来只需用同样的方法进行拓展开发即可。