Rumah > pembangunan bahagian belakang > tutorial php > 如何满足 API 场景下的授权需求呢?

如何满足 API 场景下的授权需求呢?

零下一度
Lepaskan: 2023-03-10 16:08:01
asal
1622 orang telah melayarinya

介绍

在 Laravel 中,实现基于传统表单的登陆和授权已经非常简单,但是如何满足 API 场景下的授权需求呢?在 API 场景里通常通过令牌来实现用户授权,而非维护请求之间的 Session 状态。现在 Laravel 项目中可以使用 Passport 轻而易举地实现 API 授权过程,通过 Passport 可以在几分钟之内为你的应用程序添加完整的 OAuth2 服务端实现。


安装

使用 Composer 依赖包管理器安装 Passport :

 composer require laravel/passport
Salin selepas log masuk

接下来,将 Passport 的服务提供者注册到配置文件 config/app.php 的 providers 数组中:

Laravel\Passport\PassportServiceProvider::class
Salin selepas log masuk

Passport 使用服务提供者注册内部的数据库迁移脚本目录,所以上一步完成后,你需要更新你的数据库结构。Passport 的迁移脚本会自动创建应用程序需要的客户端数据表和令牌数据表:

php artisan migrate
Salin selepas log masuk

接下来,你需要运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条命令也会创建「私人访问」客户端和「密码授权」客户端:

php artisan passport:install
Salin selepas log masuk

上面命令执行后,修改 App\User.php ,用于检查已认证用户的令牌和使用作用域:

<?php

namespace App;use Laravel\Passport\HasApiTokens; // 新增use Illuminate\Notifications\Notifiable;use Illuminate\Foundation\Auth\User as Authenticatable;class User extends Authenticatable
{use HasApiTokens, Notifiable; // 增加 HasApiTokens
Salin selepas log masuk

接下来,需要在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 函数。这个函数会注册一些在访问令牌、客户端、私人访问令牌的发放和吊销过程中会用到的必要路由:

修改 App\Providers\AuthServiceProvider.php :

<?php

namespace App\Providers;use Laravel\Passport\Passport; // 新增use Illuminate\Support\Facades\Gate;use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;use Carbon\Carbon; // 新增引用class AuthServiceProvider extends ServiceProvider
{/**
     * The policy mappings for the application.
     *
     * @var array     */protected $policies = [&#39;App\Model&#39; => 'App\Policies\ModelPolicy',];/**
     * Register any authentication / authorization services.
     *
     * @return void     */public function boot()
    {$this->registerPolicies();

        Passport::routes(); // 注册passport路由

        //令牌的有效期Passport::tokensExpireIn(Carbon::now()->addDays(15));

        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
    }
}
Salin selepas log masuk

最后,需要将配置文件 config/auth.php 中 api 部分的授权保护项( driver )改为 passport 。此调整会让你的应用程序在接收到 API 的授权请求时使用 Passport 的 TokenGuard 来处理:

'guards' => ['web' => ['driver' => 'session',
        'provider' => 'users',],

    'api' => ['driver' => 'passport', // 改为passport'provider' => 'users',],],
Salin selepas log masuk

测试

api的路由是api.php 。打开 routes\api.php ,添加测试路由。

Route::group(['namespace' => 'api'], function () {
    Route::post('/login', 'UserController@login');
});

Route::group(['middleware' => 'auth:api', 'namespace' => 'api'], function() {
    Route::get('details', 'UserController@details');
});
Salin selepas log masuk

一个是用来登录,获取token,另一个是用获取到的token完成登录验证,取到当前用户资料。

details路由,用到了auth:api 中间件,用它来验证token。

在 App\Http\ 目录建立 api 文件夹,并添加UserController.php 

<?php

namespace App\Http\Controllers\api;use Illuminate\Http\Request;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\Auth;use App\User;use Response;class UserController extends Controller
{public function __construct()
    {$this->content = array();
    }public function login()
    {if(Auth::attempt(['email' => request('email'), 'password' => request('password')]))
        {$user = Auth::user();$this->content['token'] =  $user->createToken('Pizza App')->accessToken;$status = 200;
        } else {$this->content['error'] = "未授权";             $status = 401;
        }         return response()->json($this->content, $status);    
    }public function details()
    {return response()->json(['user' => Auth::user()]);
    }
}
Salin selepas log masuk

在 postman 里测试:

如上图所示,登录方法要匹配路由,用post方式,以表单方式把用户的email 和 password 传递到 api/login 

 

如果传递正确的话,会得到上图的token

把上个步骤得到的token 添加在Header里,并在token前加上'Bearer '。然后就可以得到当前用户的资料了。也就是完成了用户身份验证。

 

以上不保证完全正确。欢迎查看我的GitHub的代码。

 

Atas ialah kandungan terperinci 如何满足 API 场景下的授权需求呢?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Isu terkini
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan