Laravel实现Cookie+Session认证的Api开发
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类名的负数形式“蛇形命名”来指定表明。如:Flight
Model存储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
);
}
通过访问User
Model提供的抽象表方法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的技术基本已经讲解了,接下来只需用同样的方法进行拓展开发即可。