具有OAuth2问题的Laravel

时间:2017-02-09 11:35:56

标签: php laravel-5 oauth-2.0

我正在开发一个带有laravel和lucadegasperi / oauth2-server-laravel且密码为grand type的项目。 一切正常,我的所有API端点都受到oauth2的保护。

我只有一个应始终返回JSON数据响应的API,但此响应取决于用户是否已登录。 由于Auth检查正在中间件“OAuthExceptionHandlerMiddleware”中处理,如果用户未登录,请求将停止,并且不会到达我的控制器,我得到以下响应:

{
  "error": "invalid_request",
  "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \"access token\" parameter."
}

我希望实现的是能够仅在一个API端点处理我的控制器内的请求:

  • 如果用户未登录,则返回正常响应+其他数据,而不是“无效请求”响应。
  • 如果用户已登录,则返回正常响应。

感谢您提供有关如何实现上述目标的任何帮助。

2 个答案:

答案 0 :(得分:0)

您可以向中间件添加例外以删除身份验证规则。

这样的东西
$this->middleware('auth', ['except' => array('getActivate', 'getLogin')]);

请参阅Laracasts

答案 1 :(得分:0)

要在控制器内而不是在中间件中进行身份验证,我最终执行了以下操作:

use League\OAuth2\Server\Entity\AccessTokenEntity;
use LucaDegasperi\OAuth2Server\Facades\Authorizer;
use Illuminate\Http\Request;

class ProductController extends Controller {

    public function __construct(Request $request) {
        $this->middleware('oauth', ['except' => ['index']]);
    }

    public function index(Request $request) {
        Authorizer::setRequest($request);
        $accessTokenString = Authorizer::getChecker()->determineAccessToken(true);
        $accessToken = Authorizer::getChecker()->getAccessTokenStorage()->get($accessTokenString);
        if ($accessToken instanceof AccessTokenEntity) {
            echo "logged In with user_id = " . $accessToken->getSession()->getOwnerId();
            //return public products + products related to user 
        }else{
            echo "not logged in";
            //return public products
        }
    }
}