laravel 5.4以上
$ composer require laravel/passport
在配置文件 config/app.php 的providers 数组中注册 Passport 服务提供者:
LaravelPassportPassportServiceProvider::class,
迁移数据库 执行完后会生成oauth需要的表
$ php artisan migrate
这一步注意,执行的时候可能会报错
Syntax error or access violation: 1071 Specified key was too long; max key length is 767 byte
这是由于 Laravel5.4默认使用utf8mb4 编码
utf8 最大长度字符是3字节 utf8mb4是4字节
解决方法就是
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Schema::defaultStringLength(191);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
另外Mysql 5.5.3之后才支持utf8mb4也需要注意下
接下来执行
$ php artisan passport:install
会生成两个客户端密钥
Client ID: 1
Client Secret: AwDMcCs65rXkzF80wPaINx5fkoXEfa8lcuuPEvQK
Password grant client created successfully.
Client ID: 2
Client Secret: KLlLijWk3hX2Ntfzo2iFPgwT4GyITpBjEuDozp5H
这里可以配置的只有access token的生命周期默认是永久的
在AuthServiceProvider中配置
use Carbon\Carbon;
use Laravel\Passport\Passport;
/**
* 注册所有认证/授权服务.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(Carbon::now()->addDays(15));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}
修改auth.php
'guards'['driver'] => 'passport'
颁发
应用场景 我的用户,在别的网站想用我的账号直接登录,参考微信登录。那么第三方网站就要对接过来,用户选择第三方登录,跳转到我的页面,询问用户是否允许,用户允许以后我会带一个code回去,第三方网站用这个code请求access_token
流程是
请求令牌
'client_id' => 'client-id',
'redirect_uri' => 'http://example.com/callback',
'response_type' => 'code',
'scope' => '',
用户允许以后拿到code换token
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'redirect_uri' => 'http://example.com/callback',
'code' => $request->code,
],
]);
token如果过期了,可以刷新
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'refresh_token',
'refresh_token' => 'the-refresh-token',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'scope' => '',
],
]);
账号密码
这个主要是用于APP(我自己的),用户通过app输入账号和密码,我用账号密码校验正确了就发送access_token
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'taylor@laravel.com',
'password' => 'my-password',
'scope' => '',
],
]);
隐式
这种跟第一种差不多,就是省去了code 直接发放,主要用于
JavaScript 或移动应用中客户端登录认证信息不能保存时
客户端证书
这种主要用于机器之间的通信
直接用appid 和 appsecret 换令牌
$response = $guzzle->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'client_credentials',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'scope' => 'your-scope',
],
]);
私人访问令牌
这个用于在程序里面调用API的时候
比如
$user = App\User::find(1);
// 创建一个不带域的令牌...
$token = $user->createToken('Token Name')->accessToken;
// 创建一个带域的令牌...
$token = $user->createToken('My Token', ['place-orders'])->accessToken;
在调用api之前需要创建client
创建命令是 $ php artisan passport:client
密码和私人的不同其他都一样
$ php artisan passport:client --password
$ php artisan passport:client --personal
创建好后获得client-id和client-secret
5.4以后目录结构发生变化,路由统一写在routes文件夹下。
API的路由都写在api.php
确定好路由就可以请求接口了
GET 方式
/api/user
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
写到这里遇到一个问题
就是无论怎样请求 获取到的token 用来访问接口的时候 总是返回
Unauthenticated
GOOGLE了下发现好多人也遇到这个问题,据说是token过期时间的问题
在AuthServiceProvider boot里面加上
Passport::tokensExpireIn(Carbon::now()->addDays(15));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
这样应该会解决,然而并没有,这里等以后一时间再研究下(已解决 见下文)
这个问题有了一定进展
目前通过用户授权颁发令牌的方式通过了
前提是用户必须登录,之前返回Unauthenticated 应该是因为用户未登录
在应用站跳转到授权站的时候,此时用户需登录状态,授权以后拿到code再来换access_token 这个方式OK的,可以正常获取登录用户的信息
账号密码获取令牌的方式也一样可以通过
站点之前通过 id 和 secret的方式换token,然后拿token请求接口这种方式目前还不行
坑爹啊,官方文档没写全
通过 client_credentials 方式获取token,请求接口的时候,路由不能用auth或者scope等中间件去验证,因为他们会首先验证有没有登录。
我们需要在app\Http\Kernel.php 的 $routeMiddleware 里面定义一个客户端API的中间件
'client_credentials' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
然后在路由里面 Route::middleware('client_credentials')
或者
Route::middleware('client_credentials:作用域名称')
这样就可以实现不登录直接调用api了
参考文档
https://laravel.com/docs/5.4/...
Original url: Access
Created at: 2018-10-09 17:03:34
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论