资讯专栏INFORMATION COLUMN

服务端和web端分离架构下使用 passport 进行前后台用户各自的认证

luffyZh / 3346人阅读

摘要:服务端和端分离架构下使用进行前后台用户各自的认证前段时间大概一年以前写了个项目使用了前后端代码分离的架构,同时又因为业务需要出现了管理端和前台商户端两套用户表登陆的需求。

服务端和web端分离架构下使用 passport 进行前后台用户各自的认证

前段时间(大概一年以前)写了个项目使用了前后端代码分离的架构,同时又因为业务需要出现了管理端和前台商户端两套用户表登陆的需求。

因为使用了 passport 包做登陆认证,但是passport又不支持多用户系统认证。所以那时候使用了一个中间表的方式去做认证,这种方式可以解决问题,但是太过复杂。

最近有个新的项目,又遇到了同样的问题所以网上找了一下是否有简单的解决方案,果然找到了一个轮子用sfelix-martins/passport-multiauth,使用它可以简单的实现,前后台分离架构下使用 passport 进行前后端用户各自的认证。

这里要感谢下 Samuel Martins 为我们提供了这么优秀的轮子,目前已经更新到3.0版本。

具体的使用方法,其实看文档基本已经很简单了。不过这里还是简单的写一下我使用的过程。

在此之前,你需要看过使用 passport 的相关教程

1.引入 smartins/passport-multiauth

composer require smartins/passport-multiauth

2.迁移数据表 oauth_access_token_providers

php artisan migrate

3.在需要认证的模型内引入 HasMultiAuthApiTokens

use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
use SMartinsPassportMultiauthHasMultiAuthApiTokens;

class Admin extends Authenticatable
{
    use Notifiable, HasMultiAuthApiTokens;
}

4.在 config/auth.php providers 数组内增加对应的 provider

// ...

    "providers" => [
        "users" => [
            "driver" => "eloquent",
            "model" => AppUser::class,
        ],

        // ** New provider**
        "admins" => [
            "driver" => "eloquent",
            "model" => AppAdmin::class,
        ],
    ],

5.在 config/auth.php guards 数组内增加对应的 guard

 // ...

    "guards" => [
        "web" => [
            "driver" => "session",
            "provider" => "users",
        ],

        "api" => [
            "driver" => "passport",
            "provider" => "users",
        ],

        // ** New guard **
        "admin" => [
            "driver" => "passport",
            "provider" => "admins",
        ],
    ],

    // ...

5.在 app/Http/Kernel.php 的 $routeMiddleware 数组内增加 AddCustomProvider 中间件。

class Kernel extends HttpKernel
{
    // ...

    /**
     * The application"s route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        // "auth" => IlluminateAuthMiddlewareAuthenticate::class,
        "auth" => SMartinsPassportMultiauthHttpMiddlewareMultiAuthenticate::class,
        "auth.basic" => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
        "bindings" => IlluminateRoutingMiddlewareSubstituteBindings::class,
        "can" => IlluminateAuthMiddlewareAuthorize::class,
        "guest" => AppHttpMiddlewareRedirectIfAuthenticated::class,
        "oauth.providers" => SMartinsPassportMultiauthHttpMiddlewareAddCustomProvider::class,
        "throttle" => IlluminateRoutingMiddlewareThrottleRequests::class,
    ];

    // ...
}

6.在 AuthServiceProvider 里面增加对应的路由

namespace AppProviders;

use Route;
use LaravelPassportPassport;
use IlluminateSupportFacadesGate;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    // ...

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();

        // Middleware `oauth.providers` middleware defined on $routeMiddleware above
        Route::group(["middleware" => "oauth.providers"], function () {
            Passport::routes(function ($router) {
                return $router->forAccessTokens();
            });
        });
    }
    // ...
}

7.运行 vendor:publish

php artisan vendor:publish --provider="SMartinsPassportMultiauthProvidersMultiauthServiceProvider"

8.在使用 oauth/token 认证的时候要增加 provider 字段

POST /oauth/token HTTP/1.1
Host: localhost
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=UTF-8
Cache-Control: no-cache

{
    "grant_type" : "refresh_token",
    "client_id": "client-id",
    "client_secret" : "client-secret",
    "refresh_token" : "refresh-token",
    "provider" : "admins"
}

到此基本就可以进行多表的认证了。

在使用过程中遇到过一个小问题,因为我是先使用 passport ,在开发过程中为了方便直接把对应的 oauth_client 表是直接用 seeder 填充的,这也样就省去了每次重置数据表的时候还需要再次运行 passport:install 去生成数据。当我使用 Personal Access Tokens 的时候会报一个错误

Trying to get property "client" of non-boject at >>>vendorlaravelpassportsrcClientRepository.php:81 

这个问题是因为 oauth_personal_access_clients 表里面没有数据,增加一条 oauth_personal_access_client 的数据就可以了

原文地址 : 服务端和web端分离架构下使用 passport 进行前后台用户各自的认证

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29712.html

相关文章

  • Node.js+MongoDB对于RestfulApi中用户token认证实践

    摘要:则是目前比较成熟的一套互联网应用程序的设计理论。则允许操作,不一样,报错返回或者加入黑名单。再看下我们的数据库中的用户信息,值也被存入了进来,便于我们之后进行权限验证。访问同时将我们的值在中以传入正确获得用户名则表示我们访问请求通过了验证。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...

    robin 评论0 收藏0
  • Node.js+MongoDB对于RestfulApi中用户token认证实践

    摘要:则是目前比较成熟的一套互联网应用程序的设计理论。则允许操作,不一样,报错返回或者加入黑名单。再看下我们的数据库中的用户信息,值也被存入了进来,便于我们之后进行权限验证。访问同时将我们的值在中以传入正确获得用户名则表示我们访问请求通过了验证。 showImg(https://segmentfault.com/img/remote/1460000008629635?w=800&h=534)...

    klinson 评论0 收藏0
  • [ 好文分享 ] 美团酒店Node全栈开发实践

    摘要:我所在的美团酒店事业部去年月份成立,新的业务新的开发团队,这一切使得我们的前后端分离推进的很彻底。日志监控平台日志监控平台是美团内部的一个日志收集系统,目前美团统一使用收集日志,具有接收格式日志的能力,而日志监控平台也是以格式日志来收集。 转自:美团技术团队 作者:美团技术团队 分享理由:很好的分享,可见,基于Node的前后端分离的架构是越显流行和重要,前端攻城狮们,No...

    wangdai 评论0 收藏0
  • PHP / Laravel API 开发推荐阅读清单

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社区优秀文章 Laravel 5.5+passport 放弃 dingo 开发 API 实战,让 API 开发更省心 - 自造车轮。 API 文档神器 Swagger 介绍及在 PHP 项目中使用 - API 文档撰写方案 推荐 Laravel API 项目必须使用的 8 个...

    shmily 评论0 收藏0
  • 浅谈微服务与接口网关

    摘要:微服务如何演变而来网关在微服务中如何发挥作用本文将以此作为话题,聊聊网关如何影响企业技术架构的演变。微服务之间相互独立,使用者无需配置环境,直接调用即可完成开发。 互联网技术日新月异,项目架构不断升级优化。随着企业微服务的兴起和第三方API的发展,API网关这一作为微服务核心组件的产品也逐渐被越来越多的人认识。微服务如何演变而来?网关在微服务中如何发挥作用?本文将以此作为话题,聊聊AP...

    Aceyclee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<