目录:
- 一、概述:
- 二、心得&重点:
- 三、问题:矛盾点:
- 四、Aouth2.0授权模式详解:
- 1、配置:
- 1.1 服务端配置:
- 1.1.1 php artisan passport:install命令:
- 1.1.2 php artisan passport:client命令:
- 1.2 模拟客户端的全配置:
- 2、验证(全部是操作客户端【web.php的代码】):
- 2.1、浏览器验证:
- 2.2、 授权模式 的postman验证。一图讲解:
- 五、Aouth2.0的密码模式:
- 网上多的是:参考[不错的资源](https://www.pilishen.com/posts/laravel-5-how-to-create-api-authentication-using-passport-example)
一、概述:
1、主要讲解:Aouth2.0授权模式和密码模式 2、使用浏览器和postman两种方式验证。
二、心得&重点:
1、完全理解透彻的一次使用
1、一定要把Aouth2.0和laravel自带的API区分开。 2、把api认证和web认证区分开
2、 oauth_clients
表的Laravel Password Grant Client和Laravel Personal Access Client的区别:
Laravel Personal Access Client
:和个人用户相关的操作。如用Aouth2.0登录、注册。Laravel Password Grant Client
:Aouth2.0的密码模式必须用这个。Aouth2.0的code模式获取访问令牌。绝壁不能用这两种,只能用带user_id的。
3、Aouth2.0授权模式过程:
A、每运行一次php artisan passport:client生成一个用户端 B、每使用不同的ID请求都出现一次授权页面(用户端通过授权模式获取access_token),但改access_token能获取的权限还是上次登录用户的东西。 C、要获取其他用户信息,就要重新登录,就要清除Cookie(postman在send按钮下方,红色)
三、问题:矛盾点:
1、laravel/framework
我是更新到了7.2。
1.1 很多版本不兼容的问题。比如·laravel/tinker、laravel/passport依赖laravel/passport 7.2之类
·的提示,我是选择修改package.json来composer update的。
1.2 laravel从6.1升级到7.2都出现了很多不兼容的问题。所以需要静下来好好想原理、代码逻辑的。
1.3 laravel的自带web登录、passport的登录、vue的首页
都会占用自动跳转默认页面
,这些还需要好好研究。
1.4 其实不必非要用别人配置好的体系,比如 美团官方~~~Laravel 加 Vue2 加Element知道了原理自己配置更灵活。
四、Aouth2.0授权模式详解:
1、配置:
1.1 服务端配置:
就只用下面5个命令,就可以配置好服务器:其他命令都是扯淡。
代码语言:javascript复制composer require laravel/passport
php artisan migrate
php artisan passport:keys
php artisan passport:install
php artisan passport:client
代码语言:javascript复制composer require laravel/ui #6.1一下的还需要运行composer require laravel/ui ‘^1.2’
#不同的版本生成的前端页面也不一样,1.2好看。【这句话又错了】
#laravel/2.4安装后很丑,需要再次运行cnpm install ,就变好看了。
cnpm install #文件报错后运行(前端问题,可能安装新组件后weapack要更新)
PHP artisan ui vue --auth #生成(复制文件)后台登录控制器等 和 前端登录的界面
vue登录界面和logincontroller是PHP artisan ui vue --auth命令复制文件而来的。不修改vue首页的时候是不会出现‘跳登录、再加载前端’的问题的
也就是说这个登录界面已经是vuejs版本的登录界面了,甚至是vuejs的使用方式的一个优秀样例。里面还有session、csrf_token等的解决方案
1.1.1 php artisan passport:install命令:
Aouth2.0密码模式~注册登录必须用该命令在oauth_clients
表生成一个Personal Access Client。同时还必须在oauth_personal_access_clients
表记录这一行,否则也无效。
1.1.2 php artisan passport:client命令:
这个命令只在oauth_clients
中生成一行带user_id的,其他表没有任何反应。
每运行一次生成一个用户端、每使用一个请求都出现一次授权页面(用户端通过code模式获取access_token)
1.2 模拟客户端的全配置:
文件:routes/web.php
代码语言:javascript复制<?php
use IlluminateSupportFacadesRoute;
// use IlluminateSupportFacadesRequest;
use IlluminateHttpRequest;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
/*******************************************************************
* 下面是Aouth2.0的授权码模式的东西 start: 这部分都是在模拟客户端(哔哩哔哩) 服务器(只用路由的的回调函数就可以充分的扮演的第三方服务器的角色了)
****************************************************************************************************
*概念:授权码:就是那个code 访问令牌:access_token 刷新令牌:refresh_token
*重点:【这句话错了】本测试根本不需要laravel/ui和vue的任何东西(官网中间大部分在讲这么用vue开发客户端)【这句话错了】
* 需要laravel/ui提供的后台登录控制器等 和 前端登录的界面。 【通过运行PHP artisan ui vue --auth添加】
***************************
* 过程:
* 1浏览器输入http://139.224.194.158:8080/start就是客户端(哔哩哔哩)的微信授权按钮(使用微信登录的按钮),
* 2点开返回的是微信的登录界面(调试的时候很多权限不对的地方要注意退出该用户的登录状态),
* 3然后就是授权界面。点authorize(授权)按钮就是授权了。
* 4服务器(微信)通过后直接重定位到服务器数据库里的redirect地址(客户端的地址)(http://139.224.194.158:8080/bilibili_kehuduan/code_callback)
* 5客户端收到access_token
**/
Auth::routes();
//这是认证服务器(微信认证服务器)提供给客户端(哔哩哔哩)的登陆界面,
//重点:绝逼不要和laravel/ui混淆,本测试根本不需要laravel/ui和vue的任何东西
Route::get('/start', function (Request $request) {
$request->session()->put('state', $state = Str::random(40));
$query = http_build_query([
'client_id' => '7',
'redirect_uri' => 'http://139.224.194.158:8080/bilibili_kehuduan/code_callback',//这里的是callback参数,必须和数据库完全一致
'response_type' => 'code',
'scope' => '',
'state' => $state, //防止CSRF(Cross—Site Request Forgery)跨站点请求伪造攻击, 区别于XSS跨站脚本攻击
]);
return redirect('http://139.224.194.158:8080/oauth/authorize?'.$query);
});
Route::get('/bilibili_kehuduan/code_callback', function (Request $request) {
$state = $request->session()->pull('state');
throw_unless(
strlen($state) > 0 && $state === $request->state,
InvalidArgumentException::class
);
$http = new GuzzleHttpClient; //伪造HTTP请求
$response = $http->post('http://139.224.194.158:8080/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => '7',
'client_secret' => 'qF1G22QTevdRe0H2ULTRloXUWggukbDIH4CnrZgm',
// 'redirect_uri' => 'http://example.com/callback',
'redirect_uri' => 'http://139.224.194.158:8080/bilibili_kehuduan/code_callback',
'code' => $request->code,
],
]);
return json_decode((string) $response->getBody(), true);
});
/**下面是授权码模式的东西end*****************************************************/
2、验证(全部是操作客户端【web.php的代码】):
2.1、浏览器验证:
浏览器url直接输入:
http://服务器/start 一步到底。