public string $issuer;
public string $clientId;
public string $clientSecret;
- public ?string $redirectUri;
public ?string $authorizationEndpoint;
public ?string $tokenEndpoint;
public ?string $endSessionEndpoint;
/**
* Apply an array of settings to populate setting properties within this class.
*/
- protected function applySettingsFromArray(array $settingsArray)
+ protected function applySettingsFromArray(array $settingsArray): void
{
foreach ($settingsArray as $key => $value) {
if (property_exists($this, $key)) {
*
* @throws InvalidArgumentException
*/
- protected function validateInitial()
+ protected function validateInitial(): void
{
$required = ['clientId', 'clientSecret', 'redirectUri', 'issuer'];
foreach ($required as $prop) {
public function validate(): void
{
$this->validateInitial();
+
$required = ['keys', 'tokenEndpoint', 'authorizationEndpoint'];
foreach ($required as $prop) {
if (empty($this->$prop)) {
throw new InvalidArgumentException("Missing required configuration \"{$prop}\" value");
}
}
+
+ $endpointProperties = ['tokenEndpoint', 'authorizationEndpoint', 'userinfoEndpoint'];
+ foreach ($endpointProperties as $prop) {
+ if (is_string($this->$prop) && !str_starts_with($this->$prop, 'https://')) {
+ throw new InvalidArgumentException("Endpoint value for \"{$prop}\" must start with https://");
+ }
+ }
}
/**
*
* @throws OidcIssuerDiscoveryException
*/
- public function discoverFromIssuer(ClientInterface $httpClient, Repository $cache, int $cacheMinutes)
+ public function discoverFromIssuer(ClientInterface $httpClient, Repository $cache, int $cacheMinutes): void
{
try {
$cacheKey = 'oidc-discovery::' . $this->issuer;
/**
* Get the settings needed by an OAuth provider, as a key=>value array.
*/
- public function arrayForProvider(): array
+ public function arrayForOAuthProvider(): array
{
- $settingKeys = ['clientId', 'clientSecret', 'redirectUri', 'authorizationEndpoint', 'tokenEndpoint', 'userinfoEndpoint'];
+ $settingKeys = ['clientId', 'clientSecret', 'authorizationEndpoint', 'tokenEndpoint', 'userinfoEndpoint'];
$settings = [];
foreach ($settingKeys as $setting) {
$settings[$setting] = $this->$setting;
'issuer' => $config['issuer'],
'clientId' => $config['client_id'],
'clientSecret' => $config['client_secret'],
- 'redirectUri' => url('/oidc/callback'),
'authorizationEndpoint' => $config['authorization_endpoint'],
'tokenEndpoint' => $config['token_endpoint'],
'endSessionEndpoint' => is_string($config['end_session_endpoint']) ? $config['end_session_endpoint'] : null,
*/
protected function getProvider(OidcProviderSettings $settings): OidcOAuthProvider
{
- $provider = new OidcOAuthProvider($settings->arrayForProvider(), [
+ $provider = new OidcOAuthProvider([
+ ...$settings->arrayForOAuthProvider(),
+ 'redirectUri' => url('/oidc/callback'),
+ ], [
'httpClient' => $this->http->buildClient(5),
'optionProvider' => new HttpBasicAuthOptionProvider(),
]);