Skip to content

Commit

Permalink
Merge pull request #12 from GewoonYorick/autodiscovery
Browse files Browse the repository at this point in the history
Adding well-known configuration and JWKS routes in Laravel
  • Loading branch information
jeremy379 committed Apr 24, 2024
2 parents 3f39392 + 38abe09 commit 8683b3b
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 0 deletions.
46 changes: 46 additions & 0 deletions src/Laravel/DiscoveryController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace OpenIDConnect\Laravel;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

class DiscoveryController
{
public function __invoke(Request $request)
{
$response = [
'issuer' => url('/'),
'authorization_endpoint' => route('passport.authorizations.authorize'),
'token_endpoint' => route('passport.token'),
'jwks_uri' => route('openid.jwks'),
'response_types_supported' => [
'code',
'token',
'id_token',
'code token',
'code id_token',
'token id_token',
'code token id_token',
'none',
],
'subject_types_supported' => [
'public',
],
'id_token_signing_alg_values_supported' => [
'RS256',
],
'scopes_supported' => config('openid.passport.tokens_can'),
'token_endpoint_auth_methods_supported' => [
'client_secret_basic',
'client_secret_post',
],
];

if (Route::has('openid.userinfo')) {
$response['userinfo_endpoint'] = route('openid.userinfo');
}

return response()->json($response, 200, [], JSON_PRETTY_PRINT);
}
}
38 changes: 38 additions & 0 deletions src/Laravel/JwksController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace OpenIDConnect\Laravel;

use Illuminate\Config\Repository as Config;
use Laravel\Passport\Passport;

class JwksController
{
public function __invoke() {
$publicKey = $this->getPublicKey();

// Source: https://www.tuxed.net/fkooman/blog/json_web_key_set.html
$keyInfo = openssl_pkey_get_details(openssl_pkey_get_public($publicKey));

$jsonData = [
'keys' => [
[
'kty' => 'RSA',
'n' => rtrim(str_replace(['+', '/'], ['-', '_'], base64_encode($keyInfo['rsa']['n'])), '='),
'e' => rtrim(str_replace(['+', '/'], ['-', '_'], base64_encode($keyInfo['rsa']['e'])), '='),
],
],
];

return response()->json($jsonData, 200, [], JSON_PRETTY_PRINT);
}

private function getPublicKey(): string {
$publicKey = str_replace('\\n', "\n", config('passport.public_key', ''));

if (!$publicKey) {
$publicKey = 'file://'.Passport::keyPath('oauth-public.key');
}

return $publicKey;
}
}
2 changes: 2 additions & 0 deletions src/Laravel/PassportServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public function boot()
$this->publishes([
__DIR__ . '/config/openid.php' => $this->app->configPath('openid.php'),
], ['openid', 'openid-config']);

$this->loadRoutesFrom(__DIR__."/routes/web.php");
}

public function makeAuthorizationServer(): AuthorizationServer
Expand Down
13 changes: 13 additions & 0 deletions src/Laravel/config/openid.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,19 @@
'identity' => \OpenIDConnect\Repositories\IdentityRepository::class,
],

'routes' => [
/**
* When set to true, this package will expose the OpenID Connect Discovery endpoint.
* - /.well-known/openid-configuration
*/
'discovery' => true,
/**
* When set to true, this package will expose the JSON Web Key Set endpoint.
* - /oauth/jwks
*/
'jwks' => true,
],

/**
* The signer to be used
*/
Expand Down
7 changes: 7 additions & 0 deletions src/Laravel/routes/web.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php
if (config('openid.routes.discovery', true)) {
Route::get('/oauth/jwks', \OpenIDConnect\Laravel\JwksController::class)->name('openid.jwks');
}
if (config('openid.routes.jwks', true)) {
Route::get('/.well-known/openid-configuration', \OpenIDConnect\Laravel\DiscoveryController::class)->name('openid.discovery');
}

0 comments on commit 8683b3b

Please sign in to comment.