最适合入门的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 一样;

这里就业不再啰嗦了;


相关文章
|
6月前
|
JSON 缓存 JavaScript
❤Nodejs 第十章(用户信息token认证和登录接口开发)
【4月更文挑战第10天】本文介绍了Node.js中实现用户信息token认证和登录接口的步骤。express-jwt的使用,接着创建基本的Express服务器,然后导入并使用jsonwebtoken和express-jwt。设置一个密钥,并定义一个中间件处理token验证。示例展示了登录接口的实现。遇到登录判断失效的问题后,对判断条件进行了优化。
233 2
|
6月前
|
JSON JavaScript 前端开发
❤Nodejs 第九章(token身份认证和express-jwt的安装认识)
【4月更文挑战第9天】Node.js第九章介绍了Token身份认证,特别是JWT(JSON Web Token)作为跨域认证的解决方案。JWT由Header、Payload和Signature三部分组成,用于在客户端和服务器间安全传输用户信息。前端收到JWT后存储在localStorage或sessionStorage中,并在请求头中发送。Express-JWT是一个中间件,用于解析JWT。基本用法包括设置secret和algorithms。注意安全问题,避免混合使用不同算法以防止降级攻击。
110 0
|
2月前
|
安全 Java 数据安全/隐私保护
|
1月前
|
存储 安全 UED
GitHub OAuth认证的Django应用
GitHub OAuth认证的Django应用
22 0
|
6月前
|
JSON 安全 API
在Python Web开发过程中:请简要介绍OAuth和JWT两种认证方式,并说明何时使用它们。
OAuth是开放授权协议,用于第三方应用安全访问用户资源;JWT是JSON格式的安全令牌,用于传递身份和权限。OAuth适合第三方登录和API访问,JWT适用于单点登录和分布式系统中的身份验证。选择取决于应用场景,两者都需确保安全实施,如加密和签名验证。
50 4
|
数据安全/隐私保护
eggjs 怎么使用 egg-jwt 进行用户鉴权实现登录功能?
eggjs 怎么使用 egg-jwt 进行用户鉴权实现登录功能?
451 0
eggjs 怎么使用 egg-jwt 进行用户鉴权实现登录功能?
|
存储 JSON 算法
go使用JWT进行跨域认证最全教学
go使用JWT进行跨域认证最全教学
162 0
|
关系型数据库 MySQL
Beego学习——Jwt实现用户登录注册
Beego学习——Jwt实现用户登录注册
196 0
|
开发框架 前端开发 .NET
IdentityServer4入门
IdentityServer4入门
|
数据安全/隐私保护 Python
Python编程:Flask-BasicAuth实现Authentication登录认证
Python编程:Flask-BasicAuth实现Authentication登录认证
267 0
Python编程:Flask-BasicAuth实现Authentication登录认证