Learning laravel: API 认证系统 Passport(一)

文档:https://d.laravel-china.org/docs/5.5/passport

编写 API,可能也是工作中比较重要的需求,而 API 的认证和网页表单认证不同:在 API 场景里通常通过令牌来实现用户授权,而非维护请求之间的 Session 状态 。Laravel 官方提供了 Passport 包,用来实现 API 场景的认证。

passport 的安装请参考文档

接下来说明文档中 发放访问令牌 的实现:

假设客户端应用为 learning-laravel-passport-demo.app, 用 Artisan 命令 passport:client 创建客户端:

注意 Client ID: 3Client secret: T0WzSMk3SDwJXUi2x8grZHwn66iVF3FaB4tyGpzP ,这就是后面要用到的 client_idclient_secret

Passport 提供了 Vue 组件,如果熟悉 Vue.js,可以使用提供的组建,创建可视化的界面,可以很方便的创建客户端,参见 前端快速上手

创建客户端应用 learning-laravel-passport-demo.app:

composer create-project laravel/laravel learning-laravel-passport-demo

创建控制器:

php artisan make:controller TestController 

编辑 TestController.php

<!---文件位置 app/Http/Controllers/TestController.php -->

class TestController extends Controller
{
    public function index(){
        return view('index');
    }
}

创建视图 index.blade.php

<!---文件位置 resources/views/index.blade.php--->

<!doctype html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>
    </head>
    <body>
    <a href="{{ route('redirect') }}"> 使用第三方登录</a>
    </body>
</html>

添加网络请求包:

composer require guzzlehttp/guzzle

创建路由:

use Illuminate\Http\Request;

......

Route::get('test','TestController@index');

Route::get('/redirect', function () {
    $query = http_build_query([
        'client_id' => '3',
        'redirect_uri' => 'http://learning-laravel-passport-demo.app/callback',
        'response_type' => 'code',
        'scope' => '',
    ]);

    return redirect('http://learning-laravel-demo.app/oauth/authorize?'.$query);
})->name('redirect');

Route::get('/callback', function (Request $request) {
    $http = new GuzzleHttp\Client;

    $response = $http->post('http://learning-laravel-demo.app/oauth/token', [
        'form_params' => [
            'grant_type' => 'authorization_code',
            'client_id' => '3',
            'client_secret' => 'T0WzSMk3SDwJXUi2x8grZHwn66iVF3FaB4tyGpzP',
            'redirect_uri' => 'http://learning-laravel-passport-demo.app/callback',
            'code' => $request->code,
        ],
    ]);

    return json_decode((string) $response->getBody(), true);
});

访问 http://learning-laravel-passport-demo.app/test:

点击 「使用第三方登录」:

点击「Authorize」:

整个过程类似使用微博、QQ等帐号登录系统。

转载请注明出处:https://www.hellocode.wang/article/learning-laravel-passport-part1

评论