安装并使用 Laravel Passport 来请求授权令牌(OAuth2.0认证方式)


一、 安装 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'=>'godcheese@blog.godcheese.com',
'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


《“安装并使用 Laravel Passport 来请求授权令牌(OAuth2.0认证方式)”》 有 12 条评论

  1. 这个手册的东西,也确实如你写的这样,但是,我一直有个问题不知道想咨询你。
    1、在app请求api的时候,虽然在路由加了auth:api,但好像请求不带token也可以访问到。
    这个东西,我不知道是怎么回事。

      • 最近我没研究了,改天测试看看,你可以在浏览器输入访问访问某个需要登录才能访问的接口。

        1、不发送头部token,访问。能否进入控制器。

        2、随便加一个token(和正确的token不一样的错误token)、访问,看看能否进入。

        我测试的时候,有没有token都可以进入控制器。我加了路由中间价了auth:api。无效果。tokend的效果只体现在,我都

        不发送了token,然后可以获得token对应的用户对象。

  2. 没有考虑安全性,差评,前端不能直接传递appid和appsecret

  3. 歌曲真好听,,不知道哪个歌是什么它就听完了,,能分享歌单吗。。

  4. 误人子弟
    'grant_type':'password',
    oauth的密码模式授权过程是服务端的交互,你直接把client_secret写前端代码里了。

    • 这里只是演示如何安装并使用 Laravel Passport 来请求授权令牌(OAuth2.0认证方式),安全问题是你自己需要考虑的问题了,难道我还在这里写明如何教你把 JavaScript 中的 client_id和client_key 隐藏吗?更何况就算隐藏又能咋样?你整站用着 http照样被抓包,难道我还要写明如何启用 https吗?笑话。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注