如何在没有auth的情况下验证用户:laravel 5.3中的api中间件?

时间:2017-02-27 09:04:52

标签: laravel authentication request laravel-5.3

我有一条公共路线,任何用户都可以访问它。 (Error:A problem occurred evaluating project ':vlc-android'. > A problem occurred starting process 'command 'git'' )。
在此操作中,如果用户已通过身份验证,我必须告诉他是否喜欢该帖子 如果路由包含/timeline中间件,我可以使用auth:api获取经过身份验证的用户,但如果我不使用$request->user()中间件,即使用户已经过身份验证,我也无法检查用户是否已通过身份验证用户发送正确的access_token 如何在没有中间件的情况下检查access_token是否正确并在控制器中验证用户?

4 个答案:

答案 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得到验证。我的猜测是你会在那里找到答案