使用Laravel5.6+Passsport 构建Api项目

使用Laravel5.6+Passsport 构建Api项目

个人博客,防止重复造轮子

Github

场景:需要将原有的系统,对接App。原有的系统用的是Laravel5.4框架,没有采用Laravel自带的auth认证模块,项目自己写了认证。而我经过多方面的考虑,发现还是使用passport来做OAuth2.0会比较快捷。在原有系统上无法叠加,所以决定放弃单独重写Api项目。

正文:

第一步,启用一个新的项目

# 如果没有composer,请先安装composer

# 如果没有laravel安装器,请先下载安装器
composer global require "laravel/installer"

# 生成api.com项目
laravel new api.com

第二步,先开启http,auth认证

cd api.com
php artisan make:auth
php artisan migrate
# 认证生成完成,在浏览器中打开 http://api.com/login
# 当然,能打开的前提是你开启了php7自带的web服务,或者配好了nginx

上面已完成http的认证,下面加入passport,实现api认证

第三步,下载passport

composer require laravel/passport
# 目前最新版本只支持laravel5.6以上,版本问题的话去下载底版本的passport

第四步,数据库迁移

php artisan migrate

第五步,生成加密键和两个预置的令牌

php artisan passport:install
# 生成记录存放在数据表 oauth_clients

第六步,修改user模型,这个模型是在第二步创建的,位于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;
}

第七步,修改AuthServiceProvider,在app/Provider/AuthServiceProvider.php中

<?php

namespace App\Providers;

# 这里
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        # 这里
        Passport::routes();
    }
}

最后一步,修改config/auth.php

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

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

使用(因为是一手APP,不是第三方,所以采用文档里提到的密码授权令牌

第一步,用client_secret获取token(可以使用postman实现)

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

    $response = $http->post('http://api.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'password',
            'client_id' => '2',
            'client_secret' => 'XtkyWdevgTnqbVtWTd8l7ASx76VtBBuZHzlAbCvm',
            'username' => '[email protected]',
            'password' => 'test123',
            'scope' => '',
        ],
    ]);

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

# 上述需要访问http://api.com/auth/password
# 其实是通过http方式获取api接口返回值,对我来说挺麻烦的,我倾向于使用postman实现上述效果,读者自行分析。
# 另外/oauth/token已经在api.php中自动注册了,无需添加
# 参数需要根据你的情况自己填写

第二步,通过第一步的token,去调用其他接口,比如下面的获取用户信息接口

Route::middleware('auth:api')->prefix('v1')->group(function (){
  Route::get('/user', function (Request $request) {
    return $request->user();
  });
});
传递访问令牌
调用被 Passport 保护的路由时,应用 API 的消费者需要在请求的 Authorization 头中指定它们的访问令牌作为 Bearer 令牌。例如
$response = $client->request('GET', '/api/user', [
    'headers' => [
        'Accept' => 'application/json',
        'Authorization' => 'Bearer '.$accessToken,
    ],
]);

上面在传递参数正确的情况下,会返回当前用户模型,如果不传或者错误Authorization,会返回{"message":"Unauthenticated."}

以上,完成Laravel-passport Api认证

拓展,可以设置token有效期,具体参考文档-令牌生命周期

猜你喜欢

转载自blog.csdn.net/m0_38092942/article/details/80993819
今日推荐