binhvd/oauth2-server-httpfoundation-bridge
Bridge package that integrates an OAuth2 server with Symfony HttpFoundation, providing request/response adapters so you can use HttpFoundation objects when working with OAuth2 flows in Laravel/PHP applications.
Installation
composer require binhvd/oauth2-server-httpfoundation-bridge
Requires league/oauth2-server (v7.x or v8.x) and Symfony’s HttpFoundation (v4.x or v5.x).
First Use Case: OAuth2 Server Integration Add the bridge to your OAuth2 server configuration:
use League\OAuth2\Server\ResourceServer;
use Binhvd\OAuth2\Server\HttpFoundationBridge\ResourceServerMiddleware;
$server = new ResourceServer(
$storage, // Your storage implementation
new ResourceServerMiddleware() // Bridge middleware
);
Middleware Integration (Laravel)
Add to app/Http/Kernel.php:
protected $middleware = [
// ...
\Binhvd\OAuth2\Server\HttpFoundationBridge\ResourceServerMiddleware::class,
];
Verify Request Handling
The bridge automatically converts HttpFoundation\Request to ServerRequestInterface for OAuth2 validation.
Protected API Endpoints Use the bridge to validate OAuth2 tokens in Laravel controllers:
public function protectedEndpoint(Request $request) {
$server = new ResourceServer($storage, new ResourceServerMiddleware());
try {
$request = $server->validateAuthenticatedRequest($request);
// Proceed if valid
} catch (\League\OAuth2\Server\Exception\OAuthServerException $e) {
return response()->json(['error' => $e->getMessage()], 401);
}
}
Token Validation in Middleware Centralize validation logic:
public function handle(Request $request, Closure $next) {
$server = resolve(ResourceServer::class);
$server->validateAuthenticatedRequest($request);
return $next($request);
}
Custom Request Parsing Override default request parsing (e.g., for custom headers):
$middleware = new ResourceServerMiddleware();
$middleware->setRequestParser(new CustomRequestParser());
Laravel Service Provider Bind the bridge to the container for dependency injection:
$this->app->bind(ResourceServer::class, function ($app) {
return new ResourceServer(
$app->make(OAuth2Storage::class),
new ResourceServerMiddleware()
);
});
Route-Level Protection Use Laravel’s route middleware:
Route::middleware(['oauth2'])->group(function () {
// Protected routes
});
Token Extraction
The bridge defaults to Authorization: Bearer <token>. Override via:
$middleware->setBearerTokenExtractor(new CustomBearerTokenExtractor());
Request Object Mutability
The bridge modifies the incoming Request object. Avoid relying on its state before validation.
Storage Compatibility
Ensure your OAuth2Storage implementation supports ServerRequestInterface. The bridge does not auto-convert legacy storage.
CORS Headers
If using CORS, ensure Access-Control-Expose-Headers includes Authorization to allow token submission.
Error Handling
OAuth2 exceptions (e.g., InvalidGrant) are not Laravel’s HttpException. Catch them explicitly:
catch (\League\OAuth2\Server\Exception\OAuthServerException $e) {
return response()->json(['error' => $e->getError()], $e->getHttpStatusCode());
}
Enable Verbose Logging Configure the OAuth2 server’s logger:
$server->setLogger(new \Monolog\Logger('oauth2', [new \Monolog\Handler\StreamHandler(storage_path('logs/oauth2.log'))]));
Request Inspection
Dump the converted ServerRequestInterface:
$request = $server->validateAuthenticatedRequest($request);
\Log::debug($request->getUri(), $request->getHeaders());
Custom Token Extractors
Implement BearerTokenExtractorInterface to support non-standard token locations (e.g., query params):
class QueryParamExtractor implements BearerTokenExtractorInterface {
public function extractBearerToken(Request $request) {
return $request->query('access_token');
}
}
Request Parser Overrides
Extend RequestParser to handle custom OAuth2 parameters:
class CustomParser extends RequestParser {
protected function parseRequest(Request $request) {
// Custom logic (e.g., for OAuth1 hybrid flows)
}
}
Middleware Chaining
Combine with Laravel’s built-in middleware (e.g., ThrottleRequests):
$middleware->setRequestParser(new RequestParser())
->setBearerTokenExtractor(new BearerTokenExtractor());
Case Sensitivity
The bridge expects Authorization headers in PascalCase (not authorization). Use strtoupper() if needed:
$header = strtoupper($request->headers->get('authorization'));
Empty Token Handling
The bridge throws InvalidBearerTokenException for missing tokens. Customize via:
$middleware->setInvalidBearerTokenException(new CustomException());
How can I help you explore Laravel packages today?