首页 > 其他分享 >Lumen框架 之api用户认证

Lumen框架 之api用户认证

时间:2023-11-17 11:01:01浏览次数:35  
标签:return admin app request 认证 token api Lumen

一、配置

1、在\app\bootstrap\app.php中取消注释

$app->withFacades();
$app->withEloquent();
$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class
]);
$app->register(App\Providers\AuthServiceProvider::class);

2、创建用户数据模型

<?php

namespace App\Models;

use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Laravel\Lumen\Auth\Authorizable;

class User extends Model implements AuthenticatableContract, AuthorizableContract
{
    use Authenticatable, Authorizable, HasFactory;

    protected $table = 'users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'api_token'
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [
        'password',
    ];
}

3、路由定义

$router->post('/user/login', ['uses' => 'ExampleController@doLogin']);

$router->group(['middleware' => 'auth'], function () use ($router) {
    $router->get('/user/info', ['uses' => 'ExampleController@info']);
});

4、Controller逻辑

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class ExampleController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {

    }

    /**
     * 用户登录
     * @return \Illuminate\Http\JsonResponse
     */
    public function doLogin()
    {
        $username = request()->input('username');
        $password = request()->input('password');
        $admin = DB::table('users')->where('username', $username)->first();
        if($admin) {
            if($admin->password == md5(md5($password).$admin->salt)) {
                $token = md5($admin->id.time());
                DB::table('users')->where('id', '=', $admin->id)->update([
                    'api_token' => $token
                ]);
                $admin->api_token = $token;
                return response()->json(['code' => 0, 'msg' => '登录成功', 'data' => $admin]);
            }
        }
        return response()->json(['code' => -1, 'msg' => '登录失败']);
    }

    /**
     * 获取用户信息
     * @return \Illuminate\Http\JsonResponse
     */
    public function info()
    {
        $user = Auth::user();
        return response()->json(['code' => 0, 'msg' => '获取成功', 'data' => $user]);
    }
}

5、认证服务,修改\app\Http\Providers\AuthServiceProvider.php文件代码

<?php

namespace App\Providers;

use App\Models\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Boot the authentication services for the application.
     *
     * @return void
     */
    public function boot()
    {
        // Here you may define how you wish users to be authenticated for your Lumen
        // application. The callback which receives the incoming request instance
        // should return either a User instance or null. You're free to obtain
        // the User instance via an API token or any other method necessary.

        $this->app['auth']->viaRequest('api', function ($request) {
            $token = $request->headers->get('api_token');
            if ($token) {
                return User::where('api_token', $token)->first();
            }
        });
    }
}

6、定义认证中间件,修改\app\Http\Middleware\Authenticate.php

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;

class Authenticate
{
    /**
     * The authentication guard factory instance.
     *
     * @var \Illuminate\Contracts\Auth\Factory
     */
    protected $auth;

    /**
     * Create a new middleware instance.
     *
     * @param  \Illuminate\Contracts\Auth\Factory  $auth
     * @return void
     */
    public function __construct(Auth $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if ($this->auth->guard($guard)->guest()) {
            return response()->json(['code' => 401, 'msg' => 'Unauthorized.']);
        }

        return $next($request);
    }
}

二、文档

https://learnku.com/docs/lumen/6.x/authentication/6108



标签:return,admin,app,request,认证,token,api,Lumen
From: https://blog.51cto.com/u_15309652/8438014

相关文章

  • Lumen框架 之数据库迁移
    一、基本操作1、/database/migrations/目录下生成一个php文件,这个文件主要包括两个函数,在up()函数中根据你的需求定义数据库字段phpartisanmake:migrationcreate_users_table--create=users<?phpuseIlluminate\Database\Migrations\Migration;useIlluminate\Database\Sch......
  • OpenAI ChatGPT 图片生成API
    图像生成了解如何使用DALL·E在API中。想要在ChatGPT中生成图像?前往chat.openai.com。介绍图像API提供了三种与图像交互的方法:基于文本提示从头开始创建图像(DALL·E3和DALL·E2)通过让模型根据新的文本提示替换预先存在的图像的某些区域来创建图像的编辑版本......
  • Fastapi框架:Starlette,Pydantic 与 FastAPI 框架是什么关系?
    【一】介绍Starlette是个什么项目;IDE开发时Python3.5+版本的"typehints"的好处:简短、直观和标准的Python类型声明;介绍Pydantic包,FastAPI项目的开发为什么要使用Pydantic【二】Starlette【1】介绍Starlette是一种轻量级的ASGI框架/工具包,是构建高性能A......
  • Fastapi框架:引入
    【一】为什么新秀FastAPI火成这样介绍FastAPI有哪些突出特点,浏览官网文档中的Feasures一览【二】FastAPI的突出特点性能优越开发效率提升200%~300%直接减少约40%的人为BUG直观易学易用经简代码/代码重复率低自带API交互文档,开发成果随时交付API开发标准化......
  • netty tls单向认证通讯
    需求背景项目主要分为监管侧和企业侧,企业侧实时上传数据到云端,云端汇聚业务数据,上传过程需要保证传输的安全性。技术实现数据上传考虑到用HTTPS或者是TCP+TLS传输。其实使用HTTPS传输协议是比较简单的,但是项目硬件使用的4G无线网卡,而且需要实时检测设备运行状态,所以使用......
  • 内网走nginx代理访问高德webapi2.0
    需求:客户的电脑都只能访问内,服务器可以访问外网,客户电脑使用的项目中用到了高德webapi2.0。10.200.31.45:32100是我们的web服务器。网上基本上都是对高德webapi1.4的配置方式,而web2.0有一些差别。1.前端修改高德地图的js应用如果是index.html引入,修改之前的应用:<script......
  • 第六章 消息认证和哈希函数 —— 现代密码学(杨波)课后题答案解析
    第五章作业参考答案1.6.1.3节的数据认证算法是由CBC模式的DES定义的,其中初始向量取为0,试说明使用CFB模式也可获得相同的结果。解:设需认证的数据分为64比特长的分组,D1,D2,…,DN,其中DN不够64比特则右边补0,由题设,数据认证算法相当于在CBC模式中初始向量取为0,并按如下关系进行:   ......
  • CreateCollection API执行流程(addCollectionMetaStep)_milvus源码解析
    CreateCollectionAPI执行流程(addCollectionMetaStep)源码解析milvus版本:v2.3.2CreateCollection这个API流程较长,也是milvus的核心API之一,涉及的内容比较复杂。这里介绍和channel相关的流程。整体架构:CreateCollection(addCollectionMetaStep)的数据流向:1.客户端sdk发......
  • 第七章 数字签名和认证协议 —— 现代密码学(杨波)课后题答案解析
    第六章作业参考答案1.在DSS数字签名标准中,取p=83=2×41+1,q=41,h=2,于是g≡22≡4mod83,若取x=57,则y≡gx≡457=77mod83。在对消息M=56签名时选择k=23,计算签名并进行验证。解:这里忽略对消息M求杂凑值的处理计算r=(gk modp)modq=(423 mod83)mod41=51mod41=10    k-1modq=......
  • IDEA插件推荐:Apipost-Helper
    IDEA是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作,一般需要打开额外的调试工具。今天给大家介绍一款IDEA插件:Apipost-Helper-2.0。代码写完直接编辑器内调试、还支持生成接口文档、接......