Laravel Passport:发送令牌请求时的其他模型条件

时间:2017-01-03 07:40:38

标签: laravel laravel-5 oauth-2.0 laravel-passport

我正在使用Password Grant Tokens为移动应用程序构建API。当用户尝试登录应用程序时,客户端会发送访问令牌请求。

用户可能没有使用发送到他的电子邮件的链接验证他的帐户。我希望为查询添加一个附加条件,并相应地提供错误响应。目前,由于Passport管理令牌部分,我无法直接执行。

如何解决这个问题?如果用户帐户有任何问题,我如何潜入令牌请求并发送自定义响应?并继续发送令牌。

3 个答案:

答案 0 :(得分:5)

来自Laravel贡献者的回答:

制作您自己的 oauth / token 路线,并将其放在/ routes中的 oauth.php 文件中:

Route::post('/oauth/token', [
    'uses' => 'Auth\CustomAccessTokenController@issueUserToken'
]);

制作CustomAccessTokenController.php

<?php

namespace App\Http\Controllers\Auth;

use Psr\Http\Message\ServerRequestInterface;
use Laravel\Passport\Http\Controllers\AccessTokenController;

class CustomAccessTokenController extends AccessTokenController
{
    /**
     * Hooks in before the AccessTokenController issues a token
     *
     *
     * @param  ServerRequestInterface $request
     * @return mixed
     */
    public function issueUserToken(ServerRequestInterface $request)
    {
        $httpRequest = request();

        // 1.
        if ($httpRequest->grant_type == 'password') {
            // 2.
            $user = \App\User::where('email', $httpRequest->username)->first();

            // Perform your validation here

            // If the validation is successfull:
            return $this->issueToken($request);
        }
    }
}

参考链接 - https://gist.github.com/istiti/225c29afee646da66224b3388c9b52d9#file-autocomplete-directive-ts-L53

答案 1 :(得分:3)

在将输入数据发送到您的身份验证服务提供商之前添加中间件,并检查针对您的数据库发送的电子邮件。如果电子邮件已经过验证,则通过将请求发送给身份验证服务提供商继续请求,否则返回错误响应,并提供您想要的任何自定义消息。

我看到人们仍在寻找这个答案,并在此页面上发表。定义您自己的 oauth / token 路由可能是一种方式,但如果您使用中间件为此目的在将数据发送到控制器之前进行更改,则更合乎逻辑。< / p>

制作中间件:php artisan make:middleware MyMiddleware

内核中注册您的中间件,并在您的身份验证中间件

之前进行
protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,//auth middleare
        'your_middleware_identifier'=>\App\Http\Middleware\MyMiddleware::class,
    ];


    /**
     * The application's middleware priority array.
     *
     * These middlewares will be executed in way they are listed.
     *
     * @var array
     */
    protected $middlewarePriority = [
        \App\Http\Middleware\MyMiddleware::class,
        \Illuminate\Auth\Middleware\Authenticate::class,
    ];

最后,您可以在AuthServiceProvider.php文件中使用您的中间件,其中您的护照路线是: 在boot()函数中

public function boot(Request $request)
    {
        $this->registerPolicies();

        Route::group(['middleware' => 'your_middleware_identifier'], function () {
            Passport::routes();
        });
    }

我希望它有所帮助

答案 2 :(得分:1)

您可以按照文档所述在用户模型中定义findForPassport方法:

https://laravel.com/docs/5.8/passport#customizing-the-username-field

<?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;

    /**
     * Find the user instance for the given username.
     *
     * @param  string  $username
     * @return \App\User
     */
    public function findForPassport($username)
    {
        return $this->where('username', $username)->first();
    }
}

还可以在用户模型中定义一个validateForPassportPasswordGrant方法。它会收到普通密码,因此您可以在此处进行其他任何验证。如果通过验证,则需要布尔值,为true。