PassportServiceProvider(Laravel)的自定义授权类型

时间:2016-11-08 21:42:49

标签: laravel laravel-5.3 laravel-passport

尝试根据本手册实施自定义授权服务提供商:

https://github.com/mikemclin/passport-custom-request-grant

register method内部我们获取auth服务器实例(使用帮助方法),然后使用AuthServer添加我们的授权:

public function register()
    {
        app(AuthorizationServer::class)->enableGrantType($this->makeCustomRequestGrant(), Passport::tokensExpireIn());
    }

这对我不起作用。我试图以另一种方式注册我的补助金:

$this->app->singleton(AuthorizationServer::class, function () {
            return tap($this->makeAuthorizationServer(), function ($server) {
                $server->enableGrantType(
                    $this->makeCustomRequestGrant(), Passport::tokensExpireIn()
                );
            });
        });

如何使用另一个授权“扩展”我的单例服务器实例?在我的情况下,我只是实例化了新的,因此以前的授权类型变得不受支持。

主要目标是创建将使用其他模型的授权 - 客户(非用户)和授权激活码。用户将使用client_credentials尝试代码,然后他可以使用激活代码授予api查询 - 使用另一个范围。

1 个答案:

答案 0 :(得分:1)

我知道这个答案可能会迟到,但我找到了解决这个问题的方法。

我只是在我的AuthServiceProvider中将授权添加到服务器,并将授权逻辑提取到Grant Class以保持干净。

您可以查看PasswordGrant类作为基础。

问候!

namespace App\Providers;

use App\Auth\Grants\FacebookGrant;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Bridge\RefreshTokenRepository;
use Laravel\Passport\Passport;
use League\OAuth2\Server\AuthorizationServer;

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();

        app(AuthorizationServer::class)->enableGrantType(
            $this->makeFacebookGrant(), Passport::tokensExpireIn()
        );

        Passport::routes();

        //
    }

    /**
     * Create and configure a Facebook grant instance.
     *
     * @return FacebookGrant
     */
    protected function makeFacebookGrant()
    {
        $grant = new FacebookGrant(
            $this->app->make(RefreshTokenRepository::class)
        );

        $grant->setRefreshTokenTTL(Passport::refreshTokensExpireIn());

        return $grant;
    }
}