开发者社区> 王磊-phper> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

最适合入门的Laravel中级教程Passport OAuth认证

简介: 最适合入门的Laravel中级教程Passport OAuth认证
+关注继续查看


终于可以开始本篇 Laravel 教程了;

如果对 OAuth 和 JWT 还不是很了解;

建议先出门左转阅读上面链接中的系列文章;

我们先来回顾一下之前讲的 OAtuh 的四个角色;

  1. 资源服务器(resource server):github 服务器
  2. 授权服务器(authorization server):github 服务器
  3. 资源所有者(resource owner):用户你
  4. 客户端(client):第三方白俊遥博客

资源服务器(resource server)和授权服务器(authorization server)我们统称为 server ;

server 提供 OAuth 的认证服务;

client 则是使用 OAauth 服务;

在 PHP 社区中有一个以开发高质量扩展包著称的组织 league ;

他们提供了两个扩展包 oauth2-serveroauth2-client ;

分别实现了 server 和 client 服务;

Laravel 官方在 oauth2-client 的基础上开发了 socialite 用于实现 OAuth 第三方登录功能;

在 oauth2-server 基础上开发了 Passport 用于实现 OAuth 的认证服务;

Passport 提供了以下功能:

  1. 管理 clients
  2. OAuth 的四种授权类型
  3. 个人访问令牌 (personal access tokens)
  4. 管理令牌作用域 (scope)

铺垫完毕下面正式进入 Passport 环节;

Passport 默认没有安装;

使用前需要先 require 引入包;

composer require laravel/passport

Bash

Copy

运行迁移生成表:

php artisan migrate

Bash

Copy

迁移命令会生成如下表:

表名作用
oauth_clients管理 clinet , 对应于前面的例子中的 白俊遥博客
oauth_auth_codes管理授权码模式 (Authorization Code) 中的 code
oauth_access_tokens管理用于认证的 access_token
oauth_refresh_tokens管理用于刷新 access_token 的 refresh_token
oauth_personal_access_clients用于 personal access token

Passport 提供了 3 个命令;

  1. 生成用于加密的 key
php artisan passport:keys

Bash

Copy

执行后会在 storage 目录下生成 key 文件;


  1. 创建 Client 的命令
php artisan passport:client

Bash

Copy

  1. 生成 key 并创建一个密码类型的 client 和个人令牌

这个命令是组合调用了上面的命令1 + 命令2

php artisan passport:install

Bash

Copy

我们这里执行安装命令:

php artisan passport:install

Bash

Copy

接着需要把 Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中;

app/User.php

<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
    use Notifiable, HasApiTokens;
    // ...
}

PHP

Copy

AuthServiceProviderboot 方法中调用 Passport::routes() ;

<?php
namespace App\Providers;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
    //..
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
    }
    // ...
}

PHP

Copy

这一步主要是注册路由的;

我们可以通过 route:list 命令查看注册的路由;



如果我们有需要修改这些方法的时候;

我们可以在 routes/api.php 覆盖这些路由即可;

最后一步配置把 config/auth.php 中 guards 的 api 的 driver 选项改为 passport ;

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

PHP

Copy

Passport 还提供了 vue 前端组件;

php artisan vendor:publish --tag=passport-components

Bash

Copy

在 resources/js/app.js 文件中注册组件;

resources/js/app.js

// ...
Vue.component(
    'passport-clients',
    require('./components/passport/Clients.vue').default
);
Vue.component(
    'passport-authorized-clients',
    require('./components/passport/AuthorizedClients.vue').default
);
Vue.component(
    'passport-personal-access-tokens',
    require('./components/passport/PersonalAccessTokens.vue').default
);
// ...

JavaScript

Copy

这里写一个管理 Client 的页面;

routes/web.php

// ...
Route::view('clients', 'clients');

PHP

Copy

resources/views/clients.blade.php

@extends('layouts.app')
@section('content')
    <passport-clients></passport-clients>
@endsection

HTML

Copy

访问 /clients 路由创建测试 Client ;




创建 Client 需要在登录状态下;

这里可以使用 Laravel 的用户认证模块;

php artisan make:auth

Bash


接下来就是 OAuth 的 4 种类型了;

Passport 的流程都是标准的 OAuth ;

只是有些请求参数会稍微不同;

这里就不赘述了;

Passport 的 token 使用的是 JWT 格式;

简单提一点的是这个 JWT 中是有一个用户 id 的 ;

如果你的系统中需要加密用户 id 的话;


除了标准的 OAuth 的 4 种类型;

Passport 还提供了个人访问令牌功能;

如果对 个人访问令牌不了解的话;

我们再次拿出之前举的例子:

OAtuh 的四个角色;

  1. 资源服务器(resource server):github 服务器
  2. 授权服务器(authorization server):github 服务器
  3. 资源所有者(resource owner):用户你
  4. 客户端(client):第三方白俊遥博客

在讲 OAuth 的时候一直都是 github 和白俊遥博客在操作;

那作为资源所有者的你如果也想使用 token 访问你自己的资源;

这时候就可以使个人访问令牌功能了;

个人访问令牌是没有过期时间的;

自然也就没有刷新 token 的功能;

Passport 同样提供了前端组件;

跟之前的管理 Clients 一样;

这里就业不再啰嗦了;


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
💖5分钟带你认识Docker核心组件💖Docker系列入门教程
Docker 并不是容器,而只是一个管理容器的引擎,Docker 的底层运行原理:Docker 服务启动→下载镜像→启动该镜像得到一个容器→容器里运行着我们想要的程序。
55 0
💖5分钟带你跑一跑Docker💖Docker系列入门教程
 虚拟化(英语:Virtualization)是一种计算机资源管理技术,是将计算机的各种硬件资源,比如服务器、网络、CPU、内存及存储等,予以抽象和转换后呈现出一套新的硬件资源环境,在这一套新的硬件环境下可以安装我们的操作系统,部署我们的应用运行环境等,它打破计算机硬件资源不可切割的障碍,使我们可以比原本的计算机硬件资源结构更好的方式来组合应用这些资源。
64 0
开发机直连 Docker 中的 Redis 容器小教程
开发机直连 Docker 中的 Redis 容器小教程
60 0
《第一本Docker书(修订版)》——2.9 Docker守护进程
当Docker软件包安装完毕后,默认会立即启动Docker守护进程。守护进程监听/var /run/docker.sock这个Unix套接字文件,来获取来自客户端的Docker请求。如果系统中存在名为docker的用户组的话,Docker则会将该套接字文件的所有者设置为该用户组。
1958 0
[翻译svg教程]svg 中的g元素
svg 中的元素用来组织svg元素。如果一组svg元素被g元素包裹了,你可以通过对g元素进行变换(transform),被g元素包裹的元素也将被变换,就好这些被svg包裹的元素是一个元素一样,和相比这是一个很好的优势,嵌套的svg中元素是不会被变换影响的。
1021 0
+关注
王磊-phper
人都是这样,安慰别人的时候头头是道,自己遇上了,立马无法自拔,道理都懂,只是情绪作祟,故事太撩人。
234
文章
6
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载