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

这篇介绍 Passport 的密码授权令牌,OAuth2 密码授权机制可以让你自己的客户端(如移动应用程序)邮箱地址或者用户名和密码获取访问令牌。

测试工具: Postman,用来测试 Api,也可以安装浏览器插件。

Github 上的一个示例:https://github.com/ProgrammationAndroid/Laravel-Passport-Android ,Laravel 和 Passport 创建 Api 及 认证, Android 客户端访问数据。这篇文章也基于这个示例。

创建发放令牌的 trait:

<!-- 文件位置  app/Http/Controllers/Api/Auth/IssueTokenTrait.php --->

trait IssueTokenTrait{

    public function issueToken(Request $request, $grantType, $scope = ""){

        $params = [
            'grant_type' => $grantType,
            'client_id' => $this->client->id,
            'client_secret' => $this->client->secret,           
            'scope' => $scope
        ];

        $request->request->add($params);

        $proxy = Request::create('oauth/token', 'POST');

        return Route::dispatch($proxy);
    }
}

这主要是对 请求令牌刷新令牌 代码的封装,具体使用请往下看。

<!-- 文件位置 app/Http/Controllers/Api/Auth/LoginController.php--->

class LoginController extends Controller
{

    use IssueTokenTrait;

    private $client;

    public function __construct(){
        $this->client = Client::find(4);
    }

    //请求令牌
    public function login(Request $request){

        $this->validate($request, [
            'username' => 'required',
            'password' => 'required'
        ]);

        return $this->issueToken($request, 'password');

    }

    //刷新令牌
    public function refresh(Request $request){
        $this->validate($request, [
            'refresh_token' => 'required'
        ]);

        return $this->issueToken($request, 'refresh_token');

    }
}

$this->client = Client::find(4); 是运行 php artisan passport:client --password 创建客户端时生成的 iClient ID,参照上图。

添加路由:

<!-- 文件位置  routes/api.php--->

Route::post('login', 'Api\Auth\LoginController@login');
Route::post('refresh', 'Api\Auth\LoginController@refresh');

测试:

创建获取文章的 Api:

 php artisan make:controller Api/ArticleController
<!-- 文件位置 app/Http/Controllers/Api/ArticleController.php --->

class ArticleController extends Controller{
    public function index(){
        $articles = Article::all();
        return response()->json(['data' => [
            'code'=>'200',
            'msg'=>'ok',
            'result'=>$articles
        ]], 200, [], JSON_NUMERIC_CHECK);
    }
}

添加路由:

<!-- 文件位置 routes/api.php --->

Route::middleware('auth:api')->group(function () {
    Route::get('articles', 'Api\ArticleController@index');
});

测试:

请求头参数 Authorization 值的构造 :'Bearer '+ 登录api 返回的 access_token 的值,参考 传递访问令牌

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

评论