经过前面 OAuth 系列 和 JWT(JSON Web Token) 的铺垫;
终于可以开始本篇 Laravel 教程了;
如果对 OAuth 和 JWT 还不是很了解;
建议先出门左转阅读上面链接中的系列文章;
我们先来回顾一下之前讲的 OAtuh 的四个角色;
资源服务器(resource server)和授权服务器(authorization server)我们统称为 server ;
server 提供 OAuth 的认证服务;
client 则是使用 OAauth 服务;
在 PHP 社区中有一个以开发高质量扩展包著称的组织 league ;
他们提供了两个扩展包 oauth2-server 和 oauth2-client ;
分别实现了 server 和 client 服务;
Laravel 官方在 oauth2-client 的基础上开发了 socialite 用于实现 OAuth 第三方登录功能;
在 oauth2-server 基础上开发了 Passport 用于实现 OAuth 的认证服务;
Passport 提供了以下功能:
铺垫完毕下面正式进入 Passport 环节;
Passport 默认没有安装;
使用前需要先 require 引入包;
composer require laravel/passport
运行迁移生成表:
php artisan migrate
迁移命令会生成如下表:
表名 | 作用 |
---|---|
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 个命令;
php artisan passport:keys
执行后会在 storage
目录下生成 key 文件;
php artisan passport:client
这个命令是组合调用了上面的命令1 + 命令2
php artisan passport:install
我们这里执行安装命令:
php artisan passport:install
接着需要把 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;
// ...
}
在 AuthServiceProvider
的 boot
方法中调用 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();
}
// ...
}
这一步主要是注册路由的;
我们可以通过 route:list
命令查看注册的路由;
如果我们有需要修改这些方法的时候;
我们可以在 routes/api.php 覆盖这些路由即可;
最后一步配置把 config/auth.php 中 guards 的 api 的 driver 选项改为 passport ;
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Passport 还提供了 vue 前端组件;
php artisan vendor:publish --tag=passport-components
在 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
);
// ...
这里写一个管理 Client 的页面;
routes/web.php
// ...
Route::view('clients', 'clients');
resources/views/clients.blade.php
@extends('layouts.app')
@section('content')
<passport-clients></passport-clients>
@endsection
访问 /clients
路由创建测试 Client ;
创建 Client 需要在登录状态下;
这里可以使用 Laravel 的用户认证模块;
php artisan make:auth
更多的可以参考之前写的文章 最适合入门的Laravel中级教程(二)用户认证 ;
接下来就是 OAuth 的 4 种类型了;
Passport 的流程都是标准的 OAuth ;
只是有些请求参数会稍微不同;
参考 Laravel 的文档并配合 OAuth 系列 服用应该都可以轻松理解了;
这里就不赘述了;
Passport 的 token 使用的是 JWT 格式;
这个我也提前写文章讲解了 JWT(JSON Web Token) ;
简单提一点的是这个 JWT 中是有一个用户 id 的 ;
如果你的系统中需要加密用户 id 的话;
可以参考我之前的文章 ;
Laravel Passport加密 JWT 格式的access_token中的sub(user_id)字段
除了标准的 OAuth 的 4 种类型;
Passport 还提供了个人访问令牌功能;
如果对 个人访问令牌不了解的话;
我们再次拿出之前举的例子:
OAtuh 的四个角色;
在讲 OAuth 的时候一直都是 github 和白俊遥博客在操作;
那作为资源所有者的你如果也想使用 token 访问你自己的资源;
这时候就可以使个人访问令牌功能了;
个人访问令牌是没有过期时间的;
自然也就没有刷新 token 的功能;
Passport 同样提供了前端组件;
跟之前的管理 Clients 一样;
这里就业不再啰嗦了;
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
小白的程序猿 :1
2020-03-21 11:36:08 回复
liseen315 :你说你是谁
2019-12-03 12:17:47 回复
guoshq :页面调用passport的vue前端组件失效的话,记得---->注册完组件后,确保运行 npm run dev 来重新编译前端资源。
2019-10-24 18:58:58 回复
████████████ :
2019-10-09 17:21:35 回复
████████████ :
2019-10-09 16:23:49 回复
████████████ :">
2019-10-09 16:16:44 回复
阿小小甘 :嘎哈哈哈哈哈哈哈哈
2019-10-09 10:12:25 回复
panxu71 :博主 ,你的博客github快捷登录 请求的接口会返回一个图像路径,你是怎么下载并保存到数据库的 ,可以分享下代码吗?
2019-09-11 17:04:37 回复
最后守城人 :666
2019-07-25 16:01:38 回复
余生未晚 :学习学习
2019-07-15 15:31:09 回复
wcxxxxxx :测试下const name = "";el.innerHTML = name; // shows the alert
2019-07-11 14:47:38 回复
beuu :登录 后 发表cgfbhncfh
2019-07-04 00:44:33 回复
River32 :q去去去
2019-06-20 18:07:41 回复
崔荣志 :我就试试
2019-06-16 14:01:11 回复
* Armani :大佬,能出一期laravel任务调度的博客吗
2019-06-11 15:32:24 回复
琳琅天上 :只想测试下评论是否支持 `markdown`
2019-06-03 22:55:02 回复
ShunYea :老大好,请教一个问题,我安装了某个laravel项目,在执行composer install时候报错,不知道如何解决,想请教一下是什么错误,谢谢。Loading composer repositories with package informationInstalling dependencies (including require-dev) from lock fileNothing to install or updatePackage phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.Generating autoload files> Illuminate\Foundation\ComposerScripts::postInstall> php -r "file_exists('.env') || copy('.env.example', '.env');"> php artisan optimizeFatal error: Uncaught Error: Call to undefined method Illuminate\Foundation\Application::configureMonologUsing() in /www/wwwroot/www.xxyyzz.com/bootstrap/app.php:44Stack trace:#0 /www/wwwroot/www.xxyyzz.com/artisan(18): require_once()#1 {main} thrown in /www/wwwroot/www.xxyyzz.com/bootstrap/app.php on line 44PHP Fatal error: Uncaught Error: Call to undefined method Illuminate\Foundation\Application::configureMonologUsing() in /www/wwwroot/www.xxyyzz.com/bootstrap/app.php:44Stack trace:#0 /www/wwwroot/www.xxyyzz.com/artisan(18): require_once()#1 {main} thrown in /www/wwwroot/www.xxyyzz.com/bootstrap/app.php on line 44Script php artisan optimize handling the post-install-cmd event returned with error code 255
2019-06-03 17:26:06 回复
云淡风晴 :phpunit-mock-objects 已经被弃用了; 这是个用于测试的包; 移除掉不会影响项目的正常运行; 执行 composer remove phpunit/phpunit-mock-objects 再试试
2019-06-03 21:48:58 回复
ShunYea :您好,我执行这个命令报的错误跟上面一毛一样……不知道是不是依赖还是什么环境没有装到位。折腾好久了。这个代码别人写的时候有的地方不严谨,故意设的套,让你付费购买。自己研究已经解决了好几个地方问题,但是安装一直不顺利。
2019-06-05 00:08:02 回复
ShunYea :参照了你的这篇文章(https://baijunyao.com/article/148),不知道这个报错是不是缺少什么组件。
2019-06-05 00:10:53 回复
ShunYea :仔细看了下,报错的会不会是这个地方:Fatal error: Uncaught Error: Call to undefined method Illuminate\Foundation\Application::configureMonologUsing(),这个错误搜了半天国外有一个人问,但是没有解决方案。不知道老大能否指点一二。谢谢。
2019-06-05 00:13:43 回复
云淡风晴 :参考这两个试试; https://github.com/barryvdh/laravel-debugbar/issues/789 https://github.com/markhilton/monolog-mysql/issues/2
2019-06-08 10:33:28 回复
JۣۖิิLۣۖิ :问问而非
2019-06-02 16:37:05 回复
liseen315 :hehhe
2019-12-03 12:19:03 回复
江南 :呵呵
2021-04-26 19:41:16 回复
最新评论