2017-02-27 81 views
2

我有一个公共路线,任何用户都可以访问它。 (/timeline)。
在这个动作中,如果用户被认证,我必须告诉他他是否喜欢这个帖子。
如果路由有auth:api中间件,我可以使用$request->user()获得通过身份验证的用户,但是如果我不使用auth:api中间件,那么即使用户发送了正确的access_token,我也无法检查用户是否已通过身份验证。
如何在没有中间件的情况下检查access_token是否正确并在控制器中验证用户身份?如何在没有认证的情况下验证用户:laravel 5.3中的api中间件?

回答

7

您可以将警卫传递给您的方法,以检查用户是否使用特定警卫登录。

$request->user('api'); 
+0

非常感谢Peter Pan。 –

+0

我的荣幸。 ;) – PeterPan666

+3

您也可以在没有请求对象的情况下使用** Auth :: guard('api') - > user()**。 – Gkiokan

3

您使用的是auth:api,所以我假定您正在讨论JSON请求。访问令牌通常坐在你的请求的头,所以你可以检查它像这样

public function timeline(Request $request) { 
    if ($request->has('access_token') || $request->header('access_token')) { 
     $user = Auth::guard('api')->user(); 
    } 

    ... 
} 
+0

谢谢埃迪。 –

+0

当您没有将注入请求的实例注入您的方法时,这会更有用。谢谢 – iko

+0

当你没有注入你的方法的Request实例时,这更有用。谢谢 – iko

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

+0

谢谢你Ilyas。我通过传球后与PeterPan的帮助合作。 –

相关问题