Laravel 护照:发送令牌请求时的附加模型条件
Laravel Passport : Additional Model Conditions while sending Token Request
我正在使用 Password Grant Tokens 为移动应用程序构建 API。当用户尝试登录应用程序时,客户端会发送访问令牌请求。
用户可能没有使用发送到他的电子邮件的 link 验证他的帐户。我希望向查询添加附加条件并相应地提供错误响应。目前Passport管理token部分,我不能直接做。
如何解决?如果用户帐户有任何问题,我如何深入令牌请求并发送自定义响应?否则继续发送令牌。
在将输入数据发送到您的身份验证服务提供商之前添加一个中间件,并根据您的数据库检查传入的电子邮件。如果电子邮件已通过验证,则通过将其发送给身份验证服务提供商来继续请求,否则 return 错误响应以及您想要的任何自定义消息。
我看到人们仍在寻找这个答案并访问此页面。定义您自己的 oauth/token 路由可能是一种方法,但如果您使用为此目的而制作的 middleware 进行更改,则它更合乎逻辑在向控制器发送数据之前。
制作一个中间件:php artisan make:middleware MyMiddleware
在kernel中注册你的中间件,并在你的身份验证中间件之前注册它
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 文件中使用您的中间件,您的 passport 路由是:
在 boot() 函数中
public function boot(Request $request)
{
$this->registerPolicies();
Route::group(['middleware' => 'your_middleware_identifier'], function () {
Passport::routes();
});
}
希望对你有帮助
来自 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);
}
}
}
参考 link - https://github.com/laravel/passport/issues/225#issuecomment-271057428
您可以按照文档所述在用户模型中定义 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
方法。它接收明文密码,因此您可以在此处进行任何其他验证。它需要一个布尔值,如果通过验证则为真。
我正在使用 Password Grant Tokens 为移动应用程序构建 API。当用户尝试登录应用程序时,客户端会发送访问令牌请求。
用户可能没有使用发送到他的电子邮件的 link 验证他的帐户。我希望向查询添加附加条件并相应地提供错误响应。目前Passport管理token部分,我不能直接做。
如何解决?如果用户帐户有任何问题,我如何深入令牌请求并发送自定义响应?否则继续发送令牌。
在将输入数据发送到您的身份验证服务提供商之前添加一个中间件,并根据您的数据库检查传入的电子邮件。如果电子邮件已通过验证,则通过将其发送给身份验证服务提供商来继续请求,否则 return 错误响应以及您想要的任何自定义消息。
我看到人们仍在寻找这个答案并访问此页面。定义您自己的 oauth/token 路由可能是一种方法,但如果您使用为此目的而制作的 middleware 进行更改,则它更合乎逻辑在向控制器发送数据之前。
制作一个中间件:php artisan make:middleware MyMiddleware
在kernel中注册你的中间件,并在你的身份验证中间件之前注册它
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 文件中使用您的中间件,您的 passport 路由是: 在 boot() 函数中
public function boot(Request $request)
{
$this->registerPolicies();
Route::group(['middleware' => 'your_middleware_identifier'], function () {
Passport::routes();
});
}
希望对你有帮助
来自 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);
}
}
}
参考 link - https://github.com/laravel/passport/issues/225#issuecomment-271057428
您可以按照文档所述在用户模型中定义 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
方法。它接收明文密码,因此您可以在此处进行任何其他验证。它需要一个布尔值,如果通过验证则为真。