zl程序教程

您现在的位置是:首页 >  其他

当前栏目

laravel + passport的Aouth2.0全解

2023-04-18 14:43:08 时间

目录:

一、概述:

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个命令,就可以配置好服务器:其他命令都是扯淡。

composer require laravel/passport
php artisan migrate
php artisan passport:keys

php artisan passport:install
php artisan passport:client
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

<?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 一步到底。

2.2、 授权模式 的postman验证。一图讲解:

五、Aouth2.0的密码模式:

网上多的是:参考不错的资源