一、 安装 Passport

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

composer require laravel/passport

接下来将

Laravel\Passport\PassportServiceProvider::class,

这句代码添加到 config/app.php 的 providers 数组,

然后运行

php artisan migrate

来运行 Passport 自带的数据库迁移文件(用于自动创建 Passport 必需的客户端数据表和令牌数据表),

然后运行

php artisan passport:install

来创建生成安全访问令牌时用到的加密密钥及私人访问和密码访问客户端。

接下来再将

Laravel\Passport\HasApiTokens

Trait 添加到 App\User 模型中,这个 Trait 会给这个模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用于。

然后在 AuthServiceProvider 的 boot 方法中添加

Passport::roues();

来注册 Passport 在访问令牌、客户端、私人访问令牌的发放和吊销过程中一些必要路由。

最后修改下配置文件 config/auth.php 中的 api driver 改为 passport,此项操作会将 API 请求时使用 Passport 的  TokenGuard 来处理授权保护。

全部配置好后,我们来请求令牌,但是发现我们并没有创建任何用户,于是我们需要用到seed来预设填充数据。
运行

php artisan make:seeder UsersTableSeeder

创建一个 Seeder

然后打开 database\seeds 文件夹里已经新建了一个叫 UserTableSeeder.php 的文件,打开它然后在 run 方法内输入以下代码:

DB::table('users')->insert([
'name'=>'admin',
'email'=>'[email protected]',
'password'=>bcrypt('admin')
]);

如图所示,

然后运行

php artisan db:seed –class=UsersTableSeeder

来往 user 表中填充刚刚添加好的 seed 数据。

接下来我们来写前端 JavaScript 请求获取用户访问令牌的例子。

二、JavaScript 请求授权令牌

这是前端 UI,

然后些下JavaScript请求代码如下( 此处仅供演示,暂时忽略安全问题。实际生产环境中不建议在前端显示 client_id 和 client_secret):

$('#loginButton').click(function(event){
event.preventDefault();
$.ajax({
type:'post',
url:'http://wodedaxue-backend/oauth/token',
dataType:'json',
data:{
'grant_type':'password',
'client_id':'2',
'client_secret':'o6N7JzK2y3pbJiQmDcHaDhrpvPHBktnAlmmfEnS7',
'username':$('#username').val(),
'password':$('#password').val(),
'scope':''
},
success:function(data){
console.log(data);
alert(JSON.stringify(data));
},
error:function(err){
console.log(err);
alert('statusCode:'+err.status+'\n'+'statusText:'+err.statusText+'\n'+'description:\n'+JSON.stringify(err.responseJSON));
}
});
});

接下来再将以下代码写入 User 模型:

/**
* 自定义用Passport授权登录:用户名+密码
* @param $username
* @return mixed
*/
public function findForPassport($username)
{
return self::where('name', $username)->first();
}

然后输入用户名 admin 和密码 admin ,点击登录按钮尝试登录:

{
token_type:"Bearer",
expires_in:31536000,
access_token:"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImNiOG…MFF7PYRIhXqCkZhZNfoLV1IYTzRmhO2oV41XR9wD7Zd3Oxl-g",
refresh_token:"sabtS2jYhqAJtVxe868OpTTgBeYgpWgfttn5h97drUgBVLN7vL…ukx7yGfGhn5h+zCouLmuh0sdjYU+dgtRweXU3jiA0Fa6/c6k="
}

成功获取访问令牌(access_token)。

然后在每次访问其它 API 时候都带上此参数。

Laravel Passport 更多参考资料:https://laravel.com/docs/5.4/passport


很高兴认识你。