我有一条公共路线,任何用户都可以访问它。 (Error:A problem occurred evaluating project ':vlc-android'.
> A problem occurred starting process 'command 'git''
)。
在此操作中,如果用户已通过身份验证,我必须告诉他是否喜欢该帖子
如果路由包含/timeline
中间件,我可以使用auth:api
获取经过身份验证的用户,但如果我不使用$request->user()
中间件,即使用户已经过身份验证,我也无法检查用户是否已通过身份验证用户发送正确的access_token
如何在没有中间件的情况下检查access_token是否正确并在控制器中验证用户?
答案 0 :(得分:15)
您可以将警卫传递给您的方法,以检查用户是否使用特定警卫登录。
$request->user('api');
答案 1 :(得分:3)
您正在使用auth:api
,所以我假设您正在谈论JSON请求。访问令牌通常位于您的请求的标头中,因此您可以像这样检查它
public function timeline(Request $request) {
if ( $request->has('access_token') || $request->header('access_token') ) {
$user = Auth::guard('api')->user();
}
...
}
答案 2 :(得分:3)
如果您使用 Sanctum 而不是 Passport:
$request->user('sanctum');
答案 3 :(得分:1)
我没有时间深入挖掘代码,但您可以查看auth:api中间件。在那里,您将找到身份验证过程的工作原理。如果你还没有发现任何事情让我知道,今晚我会调查并改进我的答案。
在文件Laravel\Passport\Http\Middleware\CheckClientCredentials
中,您会找到:
<?php
namespace Laravel\Passport\Http\Middleware;
use Closure;
use League\OAuth2\Server\ResourceServer;
use Illuminate\Auth\AuthenticationException;
use League\OAuth2\Server\Exception\OAuthServerException;
use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;
class CheckClientCredentials
{
/**
* The Resource Server instance.
*
* @var ResourceServer
*/
private $server;
/**
* Create a new middleware instance.
*
* @param ResourceServer $server
* @return void
*/
public function __construct(ResourceServer $server)
{
$this->server = $server;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*
* @throws \Illuminate\Auth\AuthenticationException
*/
public function handle($request, Closure $next, ...$scopes)
{
$psr = (new DiactorosFactory)->createRequest($request);
try{
$psr = $this->server->validateAuthenticatedRequest($psr);
} catch (OAuthServerException $e) {
throw new AuthenticationException;
}
foreach ($scopes as $scope) {
if (!in_array($scope,$psr->getAttribute('oauth_scopes'))) {
throw new AuthenticationException;
}
}
return $next($request);
}
}
当您深入挖掘时,您会看到请求在此处League\OAuth2\Server\RecourceServer.php
得到验证。我的猜测是你会在那里找到答案