我正在开发一个带有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端点处理我的控制器内的请求:
感谢您提供有关如何实现上述目标的任何帮助。
答案 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
}
}
}