Laravel6.0 使用 Jwt-auth 实现多用户接口认证

后台管理员认证 (admins 表)

首先创建数据库和表 (admins),在 routes/api.php 中,写上如下路由并创建对应控制器和方法。

Route::namespace(‘Api‘)->group(function () {
    /***
     * 管理员后台接口路由
     */
    Route::prefix(‘admin‘)->namespace(‘Admin‘)->group(function () {
        Route::post(‘register‘, ‘[email protected]‘);
        Route::post(‘login‘, ‘[email protected]login‘);
    });
    Route::prefix(‘admin‘)->namespace(‘Admin‘)->group(function () {
        Route::get(‘/‘, ‘[email protected]‘); //后台首页
    });
});

1、安装 jwt-auth

composer require tymon/jwt-auth:dev-develop

2、在 config/app.php 中注册服务提供者

Tymon\JWTAuth\Providers\LaravelServiceProvider::class,

3、生成配置文件

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

此命令会在 config 目录下生成一个 jwt.php 配置文件

4、生成密钥

php artisan jwt:secret

此命令会在你的 .env 文件中新增一行 JWT_SECRET=secret

5、创建 admins 表迁移文件

php artisan make:migration create_admins_table

添加如下代码:

public function up()
{
    Schema::create(‘admins‘, function (Blueprint $table) {
        $table->bigIncrements(‘id‘);
        $table->string(‘name‘);
        $table->string(‘email‘)->unique();
        $table->timestamp(‘email_verified_at‘)->nullable();
        $table->string(‘password‘);
        $table->rememberToken();
        $table->timestamps();
    });
}

执行迁移:

php artisan migrate

此时查看数据库,对应的 admins 表已生成。

6、创建模型

由于我们这里后台管理员设置的是 admins 表,所以需创建对应模型,执行如下命令:

php artisan make:model Models/Admin

里面添加如下代码:

<?php

namespace App\Models;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Admin extends Authenticatable implements JWTSubject
{
    use Notifiable;

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

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        ‘password‘, ‘remember_token‘,
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        ‘email_verified_at‘ => ‘datetime‘,
    ];

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

7、配置 Auth guard

在 config/auth.php 文件中,添加 guard 和 Providers,代码如下:

‘admins‘ => [
    ‘driver‘   => ‘jwt‘,
    ‘provider‘ => ‘admins‘
]

*************************

‘admins‘ => [
    ‘driver‘ => ‘eloquent‘,
    ‘model‘ => App\Models\Admin::class,
]

8、在 AdminController 中添加如下代码:

<?php

namespace App\Http\Controllers\Api\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Admin;
use Hash;

class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware(‘auth:admins‘, [‘except‘ => [‘register‘, ‘login‘]]);
    }

    /***
     * 后台管理员注册
     * @param Request $request
     */
    public function register(Request $request)
    {
        $name = $request->name;
        $email = $request->email;
        $password = $request->password;
        $check_password = $request->check_password;

        if (!$name || !$password) {
            return response()->json([‘success‘ => false, ‘message‘ => ‘用户名、邮箱或密码必填!‘]);
        }

        $pattern = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/";
        if (!preg_match($pattern, $email)) {
            return response()->json([‘success‘ => false, ‘message‘ => ‘邮箱格式不正确!‘]);
        }

        if ($check_password != $password) {
            return response()->json([‘success‘ => false, ‘message‘ => ‘两次密码输入不一致!‘]);
        }

        $admin = Admin::where(‘name‘, $name)->first();
        if ($admin) {
            return response()->json([‘success‘ => false, ‘message‘ => ‘用户名已被注册!‘]);
        }

        $password = Hash::make($password);
        $admin = Admin::create([
            ‘name‘ => $name,
            ‘email‘ => $email,
            ‘password‘ => $password
        ]);

        return response()->json([‘success‘ => true, ‘message‘ => ‘注册成功!‘, ‘admin‘ => $admin]);
    }

    /***
     * 后台管理员登录
     * @param Request $request
     */
    public function login(Request $request)
    {
        $email = $request->email;
        $password = $request->password;

        if (!$email || !$password) {
            return response()->json([‘success‘ => false, ‘message‘ => ‘邮箱或密码填写错误!‘]);
        }

        $admin = Admin::where(‘email‘, $email)->first();
        if (!$admin) {
            return response()->json([‘success‘ => false, ‘message‘ => ‘此邮箱不存在!‘]);
        }

        if (!Hash::check($password, $admin->password)) {
            return response()->json([‘success‘ => false, ‘message‘ => ‘密码填写错误!‘]);
        }

        $credentials = request([‘email‘, ‘password‘]);
        if (!$token = auth(‘admins‘)->attempt($credentials)) {
            return response()->json([‘error‘ => ‘Unauthorized‘], 401);
        }

        return $this->respondWithToken($token);
    }

    /**
     * Log the admin out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth()->logout();

        return response()->json([‘message‘ => ‘Successfully logged out‘]);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth(‘admins‘)->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            ‘access_token‘ => $token,
            ‘token_type‘ => ‘Bearer‘,
            ‘expires_in‘ => auth(‘admins‘)->factory()->getTTL() * 60
        ]);
    }
}

测试:

先注册一个后台账号,在 postman 中,如图所示:

9、使用中间件,修改之前的路由如下:

Route::namespace(‘Api‘)->group(function () {
    /***
     * 管理员后台接口路由
     */
    Route::prefix(‘admin‘)->namespace(‘Admin‘)->group(function () {
        Route::post(‘register‘, ‘[email protected]‘);
        Route::post(‘login‘, ‘[email protected]‘);
    });
    Route::prefix(‘admin‘)->namespace(‘Admin‘)->middleware(‘auth:admins‘)->group(function () {
        Route::get(‘/‘, ‘[email protected]‘); //后台首页
    });
});

测试:

实现登录,在 postman 中,如图所示:

12、获取管理员信息,在后台首页控制器中写入如下代码:

public function index()
{
    return response()->json(auth(‘admins‘)->user());
}

至此,后台接口认证已完成!

商户后台认证 (merchants 表)

这里的商户后台认证其实是重复上面的步骤,只是换了一张表而已,所以自行完成!

小程序前端用户认证 (users 表)

1、在 api.php 中添加路由并创建对应控制器和方法,users 表增加字段 openid

 /***
 * 小程序用户认证接口路由
 */
Route::any(‘/auth‘, ‘[email protected]‘);

2、在 config/auth.php 文件中,修改 guard 里面的 api 那栏,代码如下:

‘users‘ => [
    ‘driver‘ => ‘jwt‘,
    ‘provider‘ => ‘users‘,
    ‘hash‘ => false,
],

3、修改模型 User.php 代码如下:

<?php

namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

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

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

4、使用中间件,修改之前的路由如下:

/***
 * 小程序用户认证接口路由
 */
Route::any(‘/auth‘, ‘[email protected]‘);

Route::middleware(‘auth:users‘)->group(function () {
    Route::get(‘/‘, ‘[email protected]‘); //首页接口
});

5、安装 easyWeChat 第三方包

composer require "overtrue/laravel-wechat:~5.0"  #安装包文件
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"  #生成配置文件

打开配置文件 wechat.php 里面的小程序配置和支付配置,在 .env 文件中配置支付的相关参数,如下:

WECHAT_MINI_PROGRAM_APPID=*******
WECHAT_MINI_PROGRAM_SECRET=*******

WECHAT_PAYMENT_MCH_ID=*******
WECHAT_PAYMENT_APPID=*******
WECHAT_PAYMENT_KEY=*******

6、在 MiniController 控制器中添加如下代码:

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
use JWTAuth;
use EasyWeChat;
use Auth;

class MiniController extends Controller
{
    public function auth(Request $request)
    {
        $app = EasyWeChat::miniProgram();
        $session = $app->auth->session($request->code);
        $openid = $session[‘openid‘];
//        return $openid;
        //用openid查询数据库,是否已经有了,没有就创建。
        $user = User::firstOrCreate(compact(‘openid‘));

        //生成token
        $token = JWTAuth::fromUser($user);
        return response()->json([‘token‘ => ‘Bearer ‘ . $token]);
    }
}

7、创建一个小程序测试项目,在 app.js 中,刷出 code。然后 postman 测试如图:

8、最后一步获取小程序用户 id。在首页接口控制器中写入如下代码,用来打印小程序用户的 openid

public function index()
{
    return response()->json(auth(‘users‘)->user()->openid);
}

原文地址:https://www.cnblogs.com/sweetsunnyflower/p/11655747.html

时间: 2024-10-13 15:56:24

Laravel6.0 使用 Jwt-auth 实现多用户接口认证的相关文章

Spring Boot实战之Filter实现使用JWT进行接口认证

Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header.Payload 和 Signature,并包含认证信息(密码),验证通过后服务端返回一个token,之后用户使用该token作为登录凭证,适合于移动端和api jwt使用流程 本文示例接上面几篇文章中的代码进行编写,请阅读本文的同时可以参考前面几篇文章 1.添加依赖库jjwt,本文中构造jwt及解析jwt都使用了jjwt库 <dependenc

Yii2.0 restfut接口认证错误出坑指南

测试Yii2.0即接口认证功能(出坑指南)://认证 bindValTap: function () {var page = this;wx.request({url: 'http://apitest.test/invmembers?access-token=rg1v5BF7OBGE4Bze562wZSUfiStakUK_',header: {'content-type': 'application/json'},method: 'get',data: {'per-page': 6,// pag

SpringBoot2.0+Shiro+JWT 整合

SpringBoot2.0+Shiro+JWT 整合 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息. 我们利用一定的编码生成 Token,并在 Token 中加入一些非敏感信息,将其传递. 安装环境 开发工具:STS Maven版本:apache-maven-3.5.2 java jdk 1.8 MySQL版本:5.7 系统:Windows10 一.新建Maven项目 配置Maven项目的pom.xml文件 <pr

最安全的api接口认证

最安全的api接口认证 实现步骤: 1.客户端与服务器都存放着用于验证的Token字段,客户端在本地把自己的 用户名+时间戳+Token 组合进行MD5加密后生成一段新的md5-token. 2.客户端访问的时候携带:用户名.时间戳.md5-token. 3.服务端收到请求后,先判断用户名.时间戳是否合法.假设先判断发送过来的时间戳和现在的时间戳不能大于2分钟. 4.如果是在2分钟之内,到redis里查看有没有该用户为key对应的md5-token,并判断它和发送过来的md5-token是否相同

DataSnap服务端的接口认证

在服务端只要实现DSAuthenticationManager1组件的OnuserAuthenticate事件,我们就可以完成客户端接入接口的认证,他的事件如下: procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate( Sender: TObject; const Protocol, Context, User, Password: string; var valid: Boolean; UserRoles: T

django 自定义auth中user登陆认证以及自写认证

第一种: 重写自定义auth中user登陆认证模块, 引入MobelBackend from django.contrib.auth.backends import ModelBackend 重写验证模块 class CustomBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: user = Hbuser.objects.get(username

laravel6.0控制器-资源控制器

控制器: 控制器用来处理业务的,不应该处理逻辑,如果是小项目可以把逻辑写到控制器里,大点的项目应该抽离出来业务处理层如下: services业务处理层:比如:获取值,验证值,异常捕获 命名规则: 控制器名:用大驼峰命名 如:HelloController: 方法名:用小驼峰 如:helloWorld(); 成员变量:小驼峰 或者 _名称 创建控制器(可以自定义目录): php artisan make:controller UserController php artisan make:cont

ASP.NET Core 2.0利用Jwt实现授权认证

背景 在微服务架构下,一般都会按不同的业务或功能将整个系统切分成不同的独立子系统,再通过REST API或RPC进行通讯并相互调用,形成各个子系统之间的串联结构.在这里,我们将采用REST API的通讯方式.比如: 1.有一个“用户中心”独立子系统名为“Lezhima.UserHub”,是一个基于ASP.NET Core mvc 2.0的项目. 2.有一个处理用户订单的独立子系统名为“Lezhima.UserOrder”,是一个基于ASP.NET Core webp api 2.0的项目. 3.

laravel6.0路由

1.基本路由路由定义在routes目录下,路由执行是在控制器之前,路由路径 routes目录下api.php 关于接口路由定义文件包含的路由位于 api 中间件组约束之内,支持频率限制功能,这些路由是无状态的.所以请求通过这些 路由进入应用需要通过 token 进行认证并且不能访问 Session 状态.channle.php 面板文件用于注册应用支持的所有事件Broadcast.console.php 控制台定义文件用于定义所有基于闭包的控制台命令.每个闭包都被绑定到一个控制台命令并且允许与命