Add Symfony Deprecation Contracts package
- Created CHANGELOG.md to maintain version history. - Added README.md with usage instructions for the trigger_deprecation() function. - Initialized composer.json for the Symfony Deprecation Contracts library, specifying dependencies and autoloading.
This commit is contained in:
4
modules/pshowsso/deps/stevenmaguire/oauth2-keycloak/.gitignore
vendored
Normal file
4
modules/pshowsso/deps/stevenmaguire/oauth2-keycloak/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
/build
|
||||
/vendor
|
||||
composer.phar
|
||||
composer.lock
|
||||
@@ -0,0 +1,35 @@
|
||||
filter:
|
||||
excluded_paths: [test/*]
|
||||
checks:
|
||||
php:
|
||||
code_rating: true
|
||||
remove_extra_empty_lines: true
|
||||
remove_php_closing_tag: true
|
||||
remove_trailing_whitespace: true
|
||||
fix_use_statements:
|
||||
remove_unused: true
|
||||
preserve_multiple: false
|
||||
preserve_blanklines: true
|
||||
order_alphabetically: true
|
||||
fix_php_opening_tag: true
|
||||
fix_linefeed: true
|
||||
fix_line_ending: true
|
||||
fix_identation_4spaces: true
|
||||
fix_doc_comments: true
|
||||
tools:
|
||||
external_code_coverage:
|
||||
timeout: 600
|
||||
runs: 2
|
||||
php_analyzer: true
|
||||
php_code_coverage: false
|
||||
php_code_sniffer:
|
||||
config:
|
||||
standard: PSR2
|
||||
filter:
|
||||
paths: ['src']
|
||||
php_loc:
|
||||
enabled: true
|
||||
excluded_dirs: [examples, vendor, test]
|
||||
php_cpd:
|
||||
enabled: true
|
||||
excluded_dirs: [examples, vendor, test]
|
||||
@@ -0,0 +1,29 @@
|
||||
language: php
|
||||
|
||||
sudo: false
|
||||
|
||||
php:
|
||||
- 7.2
|
||||
- 7.3
|
||||
- 7.4
|
||||
- 8.0
|
||||
- 8.1
|
||||
- 8.2
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- php: 5.6
|
||||
env: 'COMPOSER_FLAGS="--prefer-stable --prefer-lowest"'
|
||||
|
||||
before_script:
|
||||
- travis_retry composer self-update
|
||||
- travis_retry composer install --no-interaction --prefer-source --dev
|
||||
- travis_retry phpenv rehash
|
||||
|
||||
script:
|
||||
- ./vendor/bin/phpcs --standard=psr2 src/
|
||||
- ./vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
|
||||
|
||||
after_script:
|
||||
- wget https://scrutinizer-ci.com/ocular.phar
|
||||
- php ocular.phar code-coverage:upload --format=php-clover coverage.clover
|
||||
@@ -0,0 +1,74 @@
|
||||
# Changelog
|
||||
All Notable changes to `oauth2-keycloak` will be documented in this file
|
||||
|
||||
## 2.1.0 - 2018-03-12
|
||||
|
||||
### Added
|
||||
- Introduce `getLogoutUrl` method on provider to build and return and authorized logout url - thanks @FlxPeters
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- Nothing
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
|
||||
## 2.0.0 - 2017-01-25
|
||||
|
||||
### Added
|
||||
- PHP 7.1 Support
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- PHP 5.5 Support
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
|
||||
## 1.0.0 - 2017-01-25
|
||||
|
||||
Bump for base package parity
|
||||
|
||||
## 0.2.0 - 2016-12-07
|
||||
|
||||
### Added
|
||||
- JSON Web Token decryption support
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- Nothing
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
|
||||
## 0.1.0 - 2015-08-31
|
||||
|
||||
### Added
|
||||
- Initial release!
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- Nothing
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
@@ -0,0 +1,42 @@
|
||||
# Contributing
|
||||
|
||||
Contributions are **welcome** and will be fully **credited**.
|
||||
|
||||
We accept contributions via Pull Requests on [Github](https://github.com/stevenmaguire/oauth2-keycloak).
|
||||
|
||||
|
||||
## Pull Requests
|
||||
|
||||
- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer).
|
||||
|
||||
- **Add tests!** - Your patch won't be accepted if it doesn't have tests.
|
||||
|
||||
- **Document any change in behaviour** - Make sure the README and any other relevant documentation are kept up-to-date.
|
||||
|
||||
- **Consider our release cycle** - We try to follow SemVer. Randomly breaking public APIs is not an option.
|
||||
|
||||
- **Create topic branches** - Don't ask us to pull from your master branch.
|
||||
|
||||
- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
|
||||
|
||||
- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.
|
||||
|
||||
- **Ensure tests pass!** - Please run the tests (see below) before submitting your pull request, and make sure they pass. We won't accept a patch until all tests pass.
|
||||
|
||||
- **Ensure no coding standards violations** - Please run PHP Code Sniffer using the PSR-2 standard (see below) before submitting your pull request. A violation will cause the build to fail, so please make sure there are no violations. We can't accept a patch if the build fails.
|
||||
|
||||
|
||||
## Running Tests
|
||||
|
||||
``` bash
|
||||
$ ./vendor/bin/phpunit
|
||||
```
|
||||
|
||||
|
||||
## Running PHP Code Sniffer
|
||||
|
||||
``` bash
|
||||
$ ./vendor/bin/phpcs src --standard=psr2 -sp
|
||||
```
|
||||
|
||||
**Happy coding**!
|
||||
176
modules/pshowsso/deps/stevenmaguire/oauth2-keycloak/README.md
Normal file
176
modules/pshowsso/deps/stevenmaguire/oauth2-keycloak/README.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# Keycloak Provider for OAuth 2.0 Client
|
||||
[](https://github.com/stevenmaguire/oauth2-keycloak/releases)
|
||||
[](LICENSE.md)
|
||||
[](https://travis-ci.org/stevenmaguire/oauth2-keycloak)
|
||||
[](https://scrutinizer-ci.com/g/stevenmaguire/oauth2-keycloak/code-structure)
|
||||
[](https://scrutinizer-ci.com/g/stevenmaguire/oauth2-keycloak)
|
||||
[](https://packagist.org/packages/stevenmaguire/oauth2-keycloak)
|
||||
|
||||
This package provides Keycloak OAuth 2.0 support for the PHP League's [OAuth 2.0 Client](https://github.com/thephpleague/oauth2-client).
|
||||
|
||||
## Installation
|
||||
|
||||
To install, use composer:
|
||||
|
||||
```
|
||||
composer require stevenmaguire/oauth2-keycloak
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Usage is the same as The League's OAuth client, using `\Stevenmaguire\OAuth2\Client\Provider\Keycloak` as the provider.
|
||||
|
||||
Use `authServerUrl` to specify the Keycloak server URL. You can lookup the correct value from the Keycloak client installer JSON under `auth-server-url`, eg. `http://localhost:8080/auth`.
|
||||
|
||||
Use `realm` to specify the Keycloak realm name. You can lookup the correct value from the Keycloak client installer JSON under `resource`, eg. `master`.
|
||||
|
||||
### Authorization Code Flow
|
||||
|
||||
```php
|
||||
$provider = new Stevenmaguire\OAuth2\Client\Provider\Keycloak([
|
||||
'authServerUrl' => '{keycloak-server-url}',
|
||||
'realm' => '{keycloak-realm}',
|
||||
'clientId' => '{keycloak-client-id}',
|
||||
'clientSecret' => '{keycloak-client-secret}',
|
||||
'redirectUri' => 'https://example.com/callback-url',
|
||||
'encryptionAlgorithm' => 'RS256', // optional
|
||||
'encryptionKeyPath' => '../key.pem' // optional
|
||||
'encryptionKey' => 'contents_of_key_or_certificate' // optional
|
||||
'version' => '20.0.1', // optional
|
||||
]);
|
||||
|
||||
if (!isset($_GET['code'])) {
|
||||
|
||||
// If we don't have an authorization code then get one
|
||||
$authUrl = $provider->getAuthorizationUrl();
|
||||
$_SESSION['oauth2state'] = $provider->getState();
|
||||
header('Location: '.$authUrl);
|
||||
exit;
|
||||
|
||||
// Check given state against previously stored one to mitigate CSRF attack
|
||||
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
|
||||
|
||||
unset($_SESSION['oauth2state']);
|
||||
exit('Invalid state, make sure HTTP sessions are enabled.');
|
||||
|
||||
} else {
|
||||
|
||||
// Try to get an access token (using the authorization coe grant)
|
||||
try {
|
||||
$token = $provider->getAccessToken('authorization_code', [
|
||||
'code' => $_GET['code']
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
exit('Failed to get access token: '.$e->getMessage());
|
||||
}
|
||||
|
||||
// Optional: Now you have a token you can look up a users profile data
|
||||
try {
|
||||
|
||||
// We got an access token, let's now get the user's details
|
||||
$user = $provider->getResourceOwner($token);
|
||||
|
||||
// Use these details to create a new profile
|
||||
printf('Hello %s!', $user->getName());
|
||||
|
||||
} catch (Exception $e) {
|
||||
exit('Failed to get resource owner: '.$e->getMessage());
|
||||
}
|
||||
|
||||
// Use this to interact with an API on the users behalf
|
||||
echo $token->getToken();
|
||||
}
|
||||
```
|
||||
|
||||
### Refreshing a Token
|
||||
|
||||
```php
|
||||
$provider = new Stevenmaguire\OAuth2\Client\Provider\Keycloak([
|
||||
'authServerUrl' => '{keycloak-server-url}',
|
||||
'realm' => '{keycloak-realm}',
|
||||
'clientId' => '{keycloak-client-id}',
|
||||
'clientSecret' => '{keycloak-client-secret}',
|
||||
'redirectUri' => 'https://example.com/callback-url',
|
||||
]);
|
||||
|
||||
$token = $provider->getAccessToken('refresh_token', ['refresh_token' => $token->getRefreshToken()]);
|
||||
```
|
||||
|
||||
### Handling encryption
|
||||
|
||||
If you've configured your Keycloak instance to use encryption, there are some advanced options available to you.
|
||||
|
||||
#### Configure the provider to use the same encryption algorithm
|
||||
|
||||
```php
|
||||
$provider = new Stevenmaguire\OAuth2\Client\Provider\Keycloak([
|
||||
// ...
|
||||
'encryptionAlgorithm' => 'RS256',
|
||||
]);
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```php
|
||||
$provider->setEncryptionAlgorithm('RS256');
|
||||
```
|
||||
|
||||
#### Configure the provider to use the expected decryption public key or certificate
|
||||
|
||||
##### By key value
|
||||
|
||||
```php
|
||||
$key = "-----BEGIN PUBLIC KEY-----\n....\n-----END PUBLIC KEY-----";
|
||||
// or
|
||||
// $key = "-----BEGIN CERTIFICATE-----\n....\n-----END CERTIFICATE-----";
|
||||
|
||||
$provider = new Stevenmaguire\OAuth2\Client\Provider\Keycloak([
|
||||
// ...
|
||||
'encryptionKey' => $key,
|
||||
]);
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```php
|
||||
$provider->setEncryptionKey($key);
|
||||
```
|
||||
|
||||
##### By key path
|
||||
|
||||
```php
|
||||
$keyPath = '../key.pem';
|
||||
|
||||
$provider = new Stevenmaguire\OAuth2\Client\Provider\Keycloak([
|
||||
// ...
|
||||
'encryptionKeyPath' => $keyPath,
|
||||
]);
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```php
|
||||
$provider->setEncryptionKeyPath($keyPath);
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
``` bash
|
||||
$ ./vendor/bin/phpunit
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Please see [CONTRIBUTING](https://github.com/stevenmaguire/oauth2-keycloak/blob/master/CONTRIBUTING.md) for details.
|
||||
|
||||
|
||||
## Credits
|
||||
|
||||
- [Steven Maguire](https://github.com/stevenmaguire)
|
||||
- [Martin Stefan](https://github.com/mstefan21)
|
||||
- [All Contributors](https://github.com/stevenmaguire/oauth2-keycloak/contributors)
|
||||
|
||||
|
||||
## License
|
||||
|
||||
The MIT License (MIT). Please see [License File](https://github.com/stevenmaguire/oauth2-keycloak/blob/master/LICENSE) for more information.
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"name": "stevenmaguire/oauth2-keycloak",
|
||||
"description": "Keycloak OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Steven Maguire",
|
||||
"email": "stevenmaguire@gmail.com",
|
||||
"homepage": "https://github.com/stevenmaguire"
|
||||
}
|
||||
],
|
||||
"keywords": [
|
||||
"oauth",
|
||||
"oauth2",
|
||||
"client",
|
||||
"authorization",
|
||||
"authorisation",
|
||||
"keycloak"
|
||||
],
|
||||
"require": {
|
||||
"php": "~7.2 || ~8.0",
|
||||
"league/oauth2-client": "^2.0",
|
||||
"firebase/php-jwt": "^6.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~9.6.4",
|
||||
"mockery/mockery": "~1.5.0",
|
||||
"squizlabs/php_codesniffer": "~3.7.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Stevenmaguire\\OAuth2\\Client\\": "src/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Stevenmaguire\\OAuth2\\Client\\Test\\": "test/src/"
|
||||
}
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"test": [
|
||||
"@putenv XDEBUG_MODE=coverage",
|
||||
"phpunit --colors=always"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
|
||||
session_start();
|
||||
|
||||
$provider = new Stevenmaguire\OAuth2\Client\Provider\Keycloak([
|
||||
'authServerUrl' => '',
|
||||
'realm' => '',
|
||||
'clientId' => '',
|
||||
'clientSecret' => '',
|
||||
'redirectUri' => '',
|
||||
'encryptionAlgorithm' => null,
|
||||
'encryptionKey' => null,
|
||||
'encryptionKeyPath' => null
|
||||
]);
|
||||
|
||||
if (!isset($_GET['code'])) {
|
||||
// If we don't have an authorization code then get one
|
||||
$authUrl = $provider->getAuthorizationUrl();
|
||||
$_SESSION['oauth2state'] = $provider->getState();
|
||||
header('Location: '.$authUrl);
|
||||
exit;
|
||||
|
||||
// Check given state against previously stored one to mitigate CSRF attack
|
||||
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
|
||||
unset($_SESSION['oauth2state']);
|
||||
exit('Invalid state, make sure HTTP sessions are enabled.');
|
||||
} else {
|
||||
// Try to get an access token (using the authorization coe grant)
|
||||
try {
|
||||
$token = $provider->getAccessToken('authorization_code', [
|
||||
'code' => $_GET['code']
|
||||
]);
|
||||
} catch (Exception $e) {
|
||||
exit('Failed to get access token: '.$e->getMessage());
|
||||
}
|
||||
|
||||
// Optional: Now you have a token you can look up a users profile data
|
||||
try {
|
||||
|
||||
// We got an access token, let's now get the user's details
|
||||
$user = $provider->getResourceOwner($token);
|
||||
// Use these details to create a new profile
|
||||
printf('Hello %s!\n<br>', $user->getName());
|
||||
|
||||
} catch (Exception $e) {
|
||||
exit('Failed to get resource owner: '.$e->getMessage());
|
||||
}
|
||||
|
||||
// Use this to interact with an API on the users behalf
|
||||
echo $token->getToken();
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit backupGlobals="false"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
failOnRisky="true"
|
||||
failOnWarning="true"
|
||||
>
|
||||
<coverage includeUncoveredFiles="true"
|
||||
pathCoverage="false"
|
||||
ignoreDeprecatedCodeUnits="true"
|
||||
disableCodeCoverageIgnore="true">
|
||||
<include>
|
||||
<directory suffix=".php">src</directory>
|
||||
</include>
|
||||
<exclude>
|
||||
<directory suffix=".php">vendor</directory>
|
||||
<file>src/autoload.php</file>
|
||||
</exclude>
|
||||
<report>
|
||||
<html outputDirectory="./build/coverage/html"
|
||||
lowUpperBound="35"
|
||||
highLowerBound="70"/>
|
||||
<clover outputFile="./build/coverage/log/coverage.xml"/>
|
||||
</report>
|
||||
</coverage>
|
||||
<testsuites>
|
||||
<testsuite name="Package Test Suite">
|
||||
<directory suffix=".php">./test/</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
</phpunit>
|
||||
@@ -1,92 +1,22 @@
|
||||
<?php //ICB0 74:0 81:91d 82:118a ?><?php //000ab
|
||||
// Copyright prestashow.com 2025. All Rights Reserved.
|
||||
// @authors prestashow.com <contact@prestashow.com>
|
||||
// @license https://prestashow.com/license
|
||||
return;
|
||||
?>
|
||||
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
|
||||
=
|
||||
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=
|
||||
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
|
||||
hV1jT/u=
|
||||
<?php
|
||||
|
||||
namespace PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider\Exception;
|
||||
|
||||
use Exception;
|
||||
|
||||
class EncryptionConfigurationException extends Exception
|
||||
{
|
||||
/**
|
||||
* Returns properly formatted exception when response decryption fails.
|
||||
*
|
||||
* @return \PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider\Exception\EncryptionConfigurationException
|
||||
*/
|
||||
public static function undeterminedEncryption()
|
||||
{
|
||||
return new static(
|
||||
'The given response may be encrypted and sufficient '.
|
||||
'encryption configuration has not been provided.',
|
||||
400
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,465 +1,391 @@
|
||||
<?php //ICB0 74:0 81:2f3b 82:5ce4 ?><?php //000ab
|
||||
// Copyright prestashow.com 2025. All Rights Reserved.
|
||||
// @authors prestashow.com <contact@prestashow.com>
|
||||
// @license https://prestashow.com/license
|
||||
return;
|
||||
?>
|
||||
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
|
||||
<?php
|
||||
|
||||
namespace PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider;
|
||||
|
||||
use Exception;
|
||||
use PShowSsoScoped\Firebase\JWT\JWT;
|
||||
use PShowSsoScoped\Firebase\JWT\Key;
|
||||
use PShowSsoScoped\League\OAuth2\Client\Provider\AbstractProvider;
|
||||
use PShowSsoScoped\League\OAuth2\Client\Provider\Exception\IdentityProviderException;
|
||||
use PShowSsoScoped\League\OAuth2\Client\Token\AccessToken;
|
||||
use PShowSsoScoped\League\OAuth2\Client\Tool\BearerAuthorizationTrait;
|
||||
use PShowSsoScoped\Psr\Http\Message\ResponseInterface;
|
||||
use PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider\Exception\EncryptionConfigurationException;
|
||||
use UnexpectedValueException;
|
||||
|
||||
class Keycloak extends AbstractProvider
|
||||
{
|
||||
use BearerAuthorizationTrait;
|
||||
|
||||
/**
|
||||
* Keycloak URL, eg. http://localhost:8080/auth.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $authServerUrl = null;
|
||||
|
||||
/**
|
||||
* Realm name, eg. demo.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $realm = null;
|
||||
|
||||
/**
|
||||
* Encryption algorithm.
|
||||
*
|
||||
* You must specify supported algorithms for your application. See
|
||||
* https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40
|
||||
* for a list of spec-compliant algorithms.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $encryptionAlgorithm = null;
|
||||
|
||||
/**
|
||||
* Encryption key.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $encryptionKey = null;
|
||||
|
||||
/**
|
||||
* Keycloak version.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $version = null;
|
||||
|
||||
/**
|
||||
* Constructs an OAuth 2.0 service provider.
|
||||
*
|
||||
* @param array $options An array of options to set on this provider.
|
||||
* Options include `clientId`, `clientSecret`, `redirectUri`, and `state`.
|
||||
* Individual providers may introduce more options, as needed.
|
||||
* @param array $collaborators An array of collaborators that may be used to
|
||||
* override this provider's default behavior. Collaborators include
|
||||
* `grantFactory`, `requestFactory`, `httpClient`, and `randomFactory`.
|
||||
* Individual providers may introduce more collaborators, as needed.
|
||||
*/
|
||||
public function __construct(array $options = [], array $collaborators = [])
|
||||
{
|
||||
if (isset($options['encryptionKeyPath'])) {
|
||||
$this->setEncryptionKeyPath($options['encryptionKeyPath']);
|
||||
unset($options['encryptionKeyPath']);
|
||||
}
|
||||
|
||||
if (isset($options['version'])) {
|
||||
$this->setVersion($options['version']);
|
||||
}
|
||||
|
||||
parent::__construct($options, $collaborators);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to decrypt the given response.
|
||||
*
|
||||
* @param string|array|null $response
|
||||
*
|
||||
* @return string|array|null
|
||||
* @throws EncryptionConfigurationException
|
||||
*/
|
||||
public function decryptResponse($response)
|
||||
{
|
||||
if (!is_string($response)) {
|
||||
return $response;
|
||||
}
|
||||
|
||||
if ($this->usesEncryption()) {
|
||||
return json_decode(
|
||||
json_encode(
|
||||
JWT::decode(
|
||||
$response,
|
||||
new Key(
|
||||
$this->encryptionKey,
|
||||
$this->encryptionAlgorithm
|
||||
)
|
||||
)
|
||||
),
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
throw EncryptionConfigurationException::undeterminedEncryption();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get authorization url to begin OAuth flow
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBaseAuthorizationUrl()
|
||||
{
|
||||
return $this->getBaseUrlWithRealm().'/protocol/openid-connect/auth';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get access token url to retrieve token
|
||||
*
|
||||
* @param array $params
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBaseAccessTokenUrl(array $params)
|
||||
{
|
||||
return $this->getBaseUrlWithRealm().'/protocol/openid-connect/token';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get provider url to fetch user details
|
||||
*
|
||||
* @param AccessToken $token
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getResourceOwnerDetailsUrl(AccessToken $token)
|
||||
{
|
||||
return $this->getBaseUrlWithRealm().'/protocol/openid-connect/userinfo';
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the logout URL.
|
||||
*
|
||||
* @param array $options
|
||||
* @return string Authorization URL
|
||||
*/
|
||||
public function getLogoutUrl(array $options = [])
|
||||
{
|
||||
$base = $this->getBaseLogoutUrl();
|
||||
$params = $this->getAuthorizationParameters($options);
|
||||
|
||||
// Starting with keycloak 18.0.0, the parameter redirect_uri is no longer supported on logout.
|
||||
// As of this version the parameter is called post_logout_redirect_uri. In addition to this
|
||||
// a parameter id_token_hint has to be provided.
|
||||
if ($this->validateGteVersion('18.0.0')) {
|
||||
if (isset($options['access_token']) === true) {
|
||||
$accessToken = $options['access_token'];
|
||||
|
||||
$params['id_token_hint'] = $accessToken->getValues()['id_token'];
|
||||
$params['post_logout_redirect_uri'] = $params['redirect_uri'];
|
||||
}
|
||||
|
||||
unset($params['redirect_uri']);
|
||||
}
|
||||
|
||||
$query = $this->getAuthorizationQuery($params);
|
||||
return $this->appendQuery($base, $query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get logout url to logout of session token
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getBaseLogoutUrl()
|
||||
{
|
||||
return $this->getBaseUrlWithRealm() . '/protocol/openid-connect/logout';
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates base url from provider configuration.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getBaseUrlWithRealm()
|
||||
{
|
||||
return $this->authServerUrl.'/realms/'.$this->realm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default scopes used by this provider.
|
||||
*
|
||||
* This should not be a complete list of all scopes, but the minimum
|
||||
* required for the provider user interface!
|
||||
*
|
||||
* @return string[]
|
||||
*/
|
||||
protected function getDefaultScopes()
|
||||
{
|
||||
$scopes = [
|
||||
'profile',
|
||||
'email'
|
||||
];
|
||||
if ($this->validateGteVersion('20.0.0')) {
|
||||
$scopes[] = 'openid';
|
||||
}
|
||||
return $scopes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the string that should be used to separate scopes when building
|
||||
* the URL for requesting an access token.
|
||||
*
|
||||
* @return string Scope separator, defaults to ','
|
||||
*/
|
||||
protected function getScopeSeparator()
|
||||
{
|
||||
return ' ';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check a provider response for errors.
|
||||
*
|
||||
* @throws IdentityProviderException
|
||||
* @param ResponseInterface $response
|
||||
* @param string $data Parsed response data
|
||||
* @return void
|
||||
*/
|
||||
protected function checkResponse(ResponseInterface $response, $data)
|
||||
{
|
||||
if (!empty($data['error'])) {
|
||||
$error = $data['error'];
|
||||
if (isset($data['error_description'])) {
|
||||
$error .= ': '.$data['error_description'];
|
||||
}
|
||||
throw new IdentityProviderException($error, $response->getStatusCode(), $data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a user object from a successful user details request.
|
||||
*
|
||||
* @param array $response
|
||||
* @param AccessToken $token
|
||||
* @return KeycloakResourceOwner
|
||||
*/
|
||||
protected function createResourceOwner(array $response, AccessToken $token)
|
||||
{
|
||||
return new KeycloakResourceOwner($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Requests and returns the resource owner of given access token.
|
||||
*
|
||||
* @param AccessToken $token
|
||||
* @return KeycloakResourceOwner
|
||||
* @throws EncryptionConfigurationException
|
||||
*/
|
||||
public function getResourceOwner(AccessToken $token)
|
||||
{
|
||||
$response = $this->fetchResourceOwnerDetails($token);
|
||||
|
||||
// We are always getting an array. We have to check if it is
|
||||
// the array we created
|
||||
if (array_key_exists('jwt', $response)) {
|
||||
$response = $response['jwt'];
|
||||
}
|
||||
|
||||
$response = $this->decryptResponse($response);
|
||||
|
||||
return $this->createResourceOwner($response, $token);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates expected encryption algorithm of Keycloak instance.
|
||||
*
|
||||
* @param string $encryptionAlgorithm
|
||||
*
|
||||
* @return Keycloak
|
||||
*/
|
||||
public function setEncryptionAlgorithm($encryptionAlgorithm)
|
||||
{
|
||||
$this->encryptionAlgorithm = $encryptionAlgorithm;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates expected encryption key of Keycloak instance.
|
||||
*
|
||||
* @param string $encryptionKey
|
||||
*
|
||||
* @return Keycloak
|
||||
*/
|
||||
public function setEncryptionKey($encryptionKey)
|
||||
{
|
||||
$this->encryptionKey = $encryptionKey;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates expected encryption key of Keycloak instance to content of given
|
||||
* file path.
|
||||
*
|
||||
* @param string $encryptionKeyPath
|
||||
*
|
||||
* @return Keycloak
|
||||
*/
|
||||
public function setEncryptionKeyPath($encryptionKeyPath)
|
||||
{
|
||||
try {
|
||||
$this->encryptionKey = file_get_contents($encryptionKeyPath);
|
||||
} catch (Exception $e) {
|
||||
// Not sure how to handle this yet.
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the keycloak version.
|
||||
*
|
||||
* @param string $version
|
||||
*
|
||||
* @return Keycloak
|
||||
*/
|
||||
public function setVersion($version)
|
||||
{
|
||||
$this->version = $version;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if provider is configured to use encryption.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function usesEncryption()
|
||||
{
|
||||
return (bool) $this->encryptionAlgorithm && $this->encryptionKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the response according to its content-type header.
|
||||
*
|
||||
* @throws UnexpectedValueException
|
||||
* @param ResponseInterface $response
|
||||
* @return array
|
||||
*/
|
||||
protected function parseResponse(ResponseInterface $response)
|
||||
{
|
||||
// We have a problem with keycloak when the userinfo responses
|
||||
// with a jwt token
|
||||
// Because it just return a jwt as string with the header
|
||||
// application/jwt
|
||||
// This can't be parsed to a array
|
||||
// Dont know why this function only allow an array as return value...
|
||||
$content = (string) $response->getBody();
|
||||
$type = $this->getContentType($response);
|
||||
|
||||
if (strpos($type, 'jwt') !== false) {
|
||||
// Here we make the temporary array
|
||||
return ['jwt' => $content];
|
||||
}
|
||||
|
||||
return parent::parseResponse($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate if version is greater or equal
|
||||
*
|
||||
* @param string $version
|
||||
* @return bool
|
||||
*/
|
||||
private function validateGteVersion($version)
|
||||
{
|
||||
return (isset($this->version) && version_compare($this->version, $version, '>='));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,154 +1,95 @@
|
||||
<?php //ICB0 74:0 81:f39 82:1ddf ?><?php //000ab
|
||||
// Copyright prestashow.com 2025. All Rights Reserved.
|
||||
// @authors prestashow.com <contact@prestashow.com>
|
||||
// @license https://prestashow.com/license
|
||||
return;
|
||||
?>
|
||||
HR+cPzjF5OebbUsjbVY0gJUSTdva0/PH0K4cek813FqDzE1eZ1DOv7OJY/cHu/kU7EDZllK7lSVn
|
||||
QmSIXMN9KdWa/i97a22NzSHEC0SF66SeEW5DoDWUsNP3N3AVxQapuIibR4DdvWLupfJ2FpYREx0p
|
||||
OY9Tx2kQcm12hnLRBxY8O+wXs9/QczBrtpt2glHUXg3Nq+laKAdlYkIOtSQLm05p7Q+3UKmM72SS
|
||||
pQQOoiD6wniKbw2Q5wYOP4dM1FRXkjaQY9XMpNFnlKsGdYB61lzfnXQMVgLdTPY4qcfDYBwLzCF9
|
||||
rnjD2wqpXd50Nv7lffkBH0xN4GY2TRaRspqHEuSm1xcQziqmxqfiWKd45IzQvHzezQEAez3Ul5Mt
|
||||
pIgC+uuLgAHVf1DBxzqDfLdH2ECjOC8aln7UrRpIJllVZhIWGvWH3001zdatzGP7Kvf2RDxQTdy6
|
||||
QTGsLLG2kGVPDdsiQ3jYpwbBhWqkLex7q+ptDk/DWHDbkuLeKUKwffMiNgMSU5HwRFSoFsu2gQVM
|
||||
A8R5ij9EGRbKAGl8NMhXhdPd8fGGD0lCNv+6XUdc0epdChxGx1AedpvuWDURBeBlKtYe/eJZaX4E
|
||||
++o8+frpRLi5EezbEDyT88Boj7DQk9QVi4TvjbLluIAnofHXOT0FIxdoVPJ9XWXRkO5LjMr3+nRR
|
||||
fXwCI2EfacGYVIlqDu0irbl/i5ev0vXIAywh4KyFT0G00yamrVPp8hITo5VF2PBFrVxuWlWi6ogJ
|
||||
rq4PNghdkFc/9hoH9EqeJx/E7QPkk8oX61zDDqU2mb1fDb5RgVr7/97LcVEmmvbbpxjLMi2wdOp/
|
||||
ZcmH/idEjgRNI0BxAGmP8aUBLIFVRSmEWk98A7zbFwRnMP1AmtMAToAmzFln1OvJz2VHETsPNE+R
|
||||
TGI6HOnEGRLSbba2wWy3CBgKigJUFi9wjMvtWdFXly4pFfMtu3Bq7RxBcvKzHuVCINpAwnV08tZT
|
||||
7vpm9Y9UbeM8qRLkSBDEv13aPTdXgod7I9MCLGQOt7eimQUenpf4IZqm40zxFcVTXpOo01Rw0p5L
|
||||
+ZlBuXk8jYcR4/j749CxMMizZuYTU7jB9g4SEFbWMYGrUIGZFVKAxPqFz7hhABW1gBQWwZTVFGXu
|
||||
vz8CJ/zSmH688wMqHyijWvo+/c8ReXn0wfrm+nLUkw6G4iv5J7Yo0NGwAb1Ged4HwTSv3c1t31us
|
||||
eCj7w8BsORrYrUVYqUs7SwC2/ojgNp8399G/cfvhOCOCII7Z0kqLcqySUb/VCefUHE8qBbxpsm+O
|
||||
i/pIoZg6ltNvCBVFDDottj22mVilExnuR0UreNMfPIXtLzd4192HbB3jL5r3OG7aSGEgcRRTIvUt
|
||||
4b4bgq5mgPIbuhHtyH2zvPIEP/7lTOZkaicZ41vARJqz+LPiuIgqgQWuL1XVXZltfyFhiosPgAoF
|
||||
oMDOf+Ej1iOxlOxgxm6I+ymqUnAuJ9D3qvEqL3g6l3uZ/pE7MpW34MrTalpd8AaatZTE9U2CH0zt
|
||||
G72V6WnBmuG8yWORA6eGscxYkLcz8apCGPoGpWTncVwpSxf1G60VN1oIWWy5W275xD0olrOaALnv
|
||||
NqK3QP09UZFDAHKXqq9ep7LA/w7+42ookRcJichCVvboUkp5yeekIOT2gpHWILeZj5ENdSUGGxqQ
|
||||
3/r2OPsZ5921DEHIXzZbIpImdcGJT729iPqrYRoBL5CRC33GZmLv/hKvl58PAnBpYmOm3Hi3UpV/
|
||||
WdjXt+TMwZRGzKyrvzACcm1CkexpQpZmMUc5AiNphFIfsCRBUD0J/Dajo/onfBNrWfMjuGrATQ0S
|
||||
UD/gJNN/hh9bg+6Ov/NLfniMHJiQHl5NIkSNKv62UdvbOMoGUj/t55EUJj1hnAXR+oaaCkTsik8e
|
||||
/5CtkoO6eDbrxmUzoPxv62xHrcuLtZfIEwc9jQWRwptf9Eav9FWT1KVfbrdjZDUW8Q53Hds3wO5B
|
||||
JSjY6O5ppMitqS04l6/AI2fX000ON7tYSKerpFrLgzqZKJB6OH5pp7XDY2GPfa3Aklw56yhl8bNI
|
||||
sRgGu8+rfFmJQGmXvYgrCHqsDCWJEsvaAbZ2eq054df05KXD0dMQPHlAhOIB8KwkzmcuV58a+GCo
|
||||
dckKraPzLu4gm+Y7LAd/qhD3oEmHqic3pxALm6uGp7Lg4V+ncOzYspjsn/k8e2md2y1FwUC/Axv9
|
||||
9Y3swtf1A0jspRrcP0aBwK1EUPD92ivBh9AIW8YPl6AoIk/c0Panes0r/tXgreMImpwWCKTyXwuI
|
||||
6FZEjYWNVzUVluJrNYtmeUV1+TonNuSCI3sU2ePr14gERFkS+dshu1lEh5QVT/4NT/eXSZcoz/Vs
|
||||
dO6Kv3Kr2bGI6xWisHcDA33w7MgImsuLDVZzN2WdlLvuaQx7gQhO+5catrynxGaxLdrqZoiSDIhp
|
||||
EMgD/SvsWatlDECm8+qioyU/bgqOuE/uPVJ1MNhq4tnEYUqYx1p46Fsssfi0RJxRFie+hibXAl5i
|
||||
0TvAFOe//wh259abHDEhr8rzS036tzVnkk0xcuF1PW1Ga6LF6FkhvebqwttMpeL/tMhhJgbTjFMB
|
||||
qUDFtk7jeVdBvFK+gDkmeafI+cziTWYZ++k1pbaeltnJY7iTg8QmpjKoY7ryZ5osAw5B2/A+PrEK
|
||||
x5IbjxXgkaqbZGtB7MAlQXFwMQeGevZ0P+NB0BG1FjN9Ia6Gx4C+ENI2xTko0z0YsYvGfyeYx825
|
||||
Qnprmo3UVQLpXMLjPr9eIkM5KJJzaZ+ndzt2vLU9AMdEQOa8XcqsoF9f/dBCX3T3oORNPG06pWn1
|
||||
qDThnixDmvmC05F5YLBe9CX78uGDoL1jeOF21OzSQc+xY6bF/YhYvDKOSZXbs83lOPjD0v6lFgDR
|
||||
UUXQkggHgY1RAwtdkcUPKPvteVJQqr+k3/fXdKoiICAdFxHxfg/IKLKhC/RAISat5OtDRoHIheGB
|
||||
ducgJJl+W1vZ6L8LR708D1QNSJrZ5Mb/34bPROEQ4C0kDFQ+SFa/IT2Fy4kB2hnc+N4//MB3Zaa5
|
||||
D7R7e2GYiLa119dgSdBVIuhQsLs9YjIEgg4QQOvsTpW6XuebitQRepBpLR5nFWVgPkHlguYuDNFL
|
||||
ceTmx1VATgs23ypxGGeRs24KJMOvezaEdJ0FLIShenLfeXfZHbehchI1+fOIdHx3JHZ4RtUrxJ5x
|
||||
GecnsUezyJ45X+lLcDCiXYAZyfvTOZ14Vq+CALBd7nyaOeb+SE6Z+VvsyTfJUJPDUAE/hVmgiqt4
|
||||
rcZSpnyHaxj9RrnwZ14KAL4BnZGs8QYmHrN1QU0+gfa+TomMoNc4AghDPeYvxp0GTCNK47XoGGBJ
|
||||
pTB+AJM6J6acaPrMChNeJj7WtZZqGHQ5jJR04al9xK/XN6cAZDyZUB7LAdDVZxnue44PaqkQZwDP
|
||||
YaGCDn34wq7yQIaCxUPikIFgZYA0hI7bCKiOLHFApHBWzu/LqQT0sBARDUGis+IT00z/602KjV5A
|
||||
FuIynhcoC/1yJO2hJLjb8sLJxzqFR8zfsFp/rIOmzldcUkaT7R+8J0zQ0Px/VMPDJJPEqO5zamBw
|
||||
sU2fdGbHYzfohf1M+HKLnPYBs8nzbzwPRjnPPPTfJtH28ESXOTi4dfiTR2dWtLu1jyQQeolHTTHK
|
||||
kUgUKtlUJDT10mAjkhBIYG===
|
||||
HR+cPqEQhburOHEHPImxVMBPvWGpJybXPzzRjCeNlk/53TSBQKZ9S8NLkQepym3Wbb82APpvf8ll
|
||||
vCst8v0eArg/aBSrFOJWYY3N4pOV7RsN+QlMjjXdJgSB7o3Tqp+XYzEo/G4Y45hRajL0RZN/nrn9
|
||||
q4vwJcRaXqmmk3UmgVMSCq6QizW2XtAEmv5FNPqMInDyW/n5qCO16JQLuGxxVlwc/h4L6zkZ/Kpi
|
||||
yPHl5XVaUkNkd6mToVPf7ubIzqo9UuqONvzg8Kjuwp2iwuzF0RpkWf1KCOJ+X6YIa63TdWDLjQxV
|
||||
WUE5oSVU7YW2dUK0P97ytArovG0EqU2e3ryYHUFaC6GXYX+pm7X3sd2/zqrsuK/b/olVpglYzYYp
|
||||
hcRVoB81fEfg1O2lUOVcMlErmoRV4ePpsXEb8OQYcSyaeqPZWcOws95e5JRtwlBlKdwW4WyJZyQA
|
||||
q6eMKf6eXB6DfSzVU7gJkxgDhB3bVk15FV3/ZohCseF//K0zpj2Ku579XbYj2xkm55snxU430RRl
|
||||
7OZUITwI4Kmd3qhwuJ32n8c5T835fKAoQZNYXbzodTbSGShbE8IGDj2Ah0G71MDh1PfeZYQOjh6P
|
||||
O4wpokkI6ns0Wlb0KnNDbye3nCBob5EUjH0tV0w3XZ0pYnjxTf7kqHYqFbzzhDtiziGv4nadiH+W
|
||||
eueE+NdvxYgPBZy9KuMHbYCzsNEZOQWjMQHifBREmBl2NYRY2J1DTi2yNNG1oaS/5KqOJQ9Sf9B4
|
||||
t4NqpkpQfhIOBowdcSzwWcR+mMxzE/PrBJLGS6KC7DIj1nCCLwzSI9+n27LAI7DC+SvnvbT0rBMP
|
||||
EoCcR8vwsGitS7KsjvMbJyrjN8PU4IA+w7XX4Cpo2+1g7m5pGmZwJ+JzRSQ3O/Bcy0pwsn//ykpM
|
||||
FHWZxNikCW8qmF2ALNHG6dh+7txsi1gS2RjGpx/zjJWDRsJlV1DerQzHLh3TVYkO2njgIzYJ0HOi
|
||||
6ENK/0+casAlewLam9olOKkDX08T5IvU/cAEf1nnbTtqX+XnxJ5xfcJazHdc4w5w1exKtqHC3wJ2
|
||||
uHMB1tjtq6/o2Q9m4BhOQjrIW3OTwjJOau6qZSrqygDvPomZThpvcvt/rzGBGdxjLULIZ/n90mKV
|
||||
sIh/HkSUIcd49VofTzcuaKo5kqlS9PF35wn63YJ8DrwRkXkASJy6YEiAuRXWMg2k9hSbi3QkIAb9
|
||||
qcOExx5aCtcgaUj07LVR9Mud9kZjXGVwpsU0HPOVgILQjxc2WaJBBAGBIJ7Y/zxZR+vgps80OXly
|
||||
hBIUwB3LJfRaf4TcQYFYkCykomkY5f+zM6n+NvcOH5e2vBK4qn5quP/wQ2JacB+nSY7T/pHmjMIM
|
||||
ZdJprXYdGkGgXnunWEZgTCllrzMO8HL6ENRQbIA3xy3AuptLrTab1KV1h3ckRaZtvCNlhdnRJh5q
|
||||
uZTr8TtuZg4m2QYsSoyP9UBGe3uKnwrFsa7excar0Fye7yTRxiTQ6MLVk9ZOjF++C0lR250Bmhs7
|
||||
Ws1h2ZPlIfk6x6iRBn9nQOjgCFQA4OWNM5QhYE5Vi9HxGIuJat6Z4UjJwcWqlQ88wojyHa7J5NBb
|
||||
YPJ4Im0Wn8PW2ItLW/4XvWXhcn1Tbr2+PxPi/BZtuB8wtMkmOzDiPa0dcAWOBl7OSLEUsFzBW222
|
||||
Nevvbs8r2/XRYobL6xSM3J/+mnv1T+HmwXad6fU2io1wcynzmr+M6qtEom8i13BhjCdwDiv7rixo
|
||||
8jLeJ9D/UUCYWsEcmse6/56neBv12IUKbLHmJqWIQhaI9K5RfwduLkcH97zJVJSLks+cwsqTCJsF
|
||||
rQG4ClDvJqdoir9JPHdBMwerKnHNiI83mlyOutPR4+0gmGvNHsKKHVMFlD2TCVvOIoDS5J2FX2Tb
|
||||
f9CHtbArlFrBG9XYd1uRZLnBki+JfsGhGSyfOowNFcIzfD1qjYufRVTJ7MZngcKVJFOb/7n8hLDe
|
||||
B5961nTPisaumL2EOe1la564TFjGL4ckIyfvrLsowp3zcqO6/Xnvr6yzKXV7zKaAJOaj8zqTBKa/
|
||||
JrJNkkA1/lsry/WzLP8Yje+M2yVVPadIbnZBYAcOCLUbgXJDWwb3VeotWrtWFL12oqHRXSCD1WrG
|
||||
JTwxz8r32Y1Aa87yqEQVwNWP0PHWhK2g42/cChaRGvvQwwQd+odKC5R/Lq2G6rSGxX+KFH03nxNY
|
||||
iMW4LIh6f1j44dC71fo+MvHzM0aO8aA0Z+FWwh0Pk/wYZ7BTk1mcG2Qe9s+K7Aeja/IMWgsoYpsy
|
||||
MDcTZyr0Ep6RVc3MSUcvUnO+4qKcUq07mWPtpqpBPW5sKp2ZyiRtlff/a3K4ZTRfSByx88k6zFsc
|
||||
CI54ZLYspf6Hqy2KGxcxsHqX/bUM8iN4qP60HuIjca6qnLsTpslUGC2DIRz/SjQf+GZzN3uXaBKR
|
||||
CUHMrQFHYMSSv73k+VghRPRhdXonXSDWvyj/SyYwB7RtVcFTEFZWo0I3lglnj/dW9BTM44OB0XR3
|
||||
0E98u76Jjm7FFwMeCxpePvYf4pJJ5yXSbu7dxpJcPD41MxbraSYSRpye5LwjzhW04W4hPR+apE5Y
|
||||
czO2RsxU+rEgVM68T4R/HYfBpIJW+AJ9R5f7c9L0UCvvR9VSKh8Hsq/d7lCqduQDTc2/9qmMhnKD
|
||||
frRb9BqaQvOEHFkaKvfW+tgu3OvjscquDihApnP4Q2g5lF53y88u/rf2ZLe96STJw2Pb3uy1vV07
|
||||
Tk5HdELds8cEie8Rp7MB4kmLoZZ1FGFPWPr/D34ZnvDDSa84S+XAfMU/+VTnakMrt5hdoklL3nZq
|
||||
mz2DRFfW1+kxxgPNA16eDsIrDhHflIoqQGkRHRUDJK3cGQLpsBkry1zYURfMqS25BI1DKzAPFI7G
|
||||
/ipPkMZVO0hCE8FEyFATdOzPA2KStPPEHH0X6nuVViMPj6ZXTeO5HbUej7ww9A/WrJzeaHdPkZAL
|
||||
gXBsV45Wu6u8UlW3Kfk1N/tvs3+dmihjr+UK5S8KZZfLD5QdkkoPwaKqoLMgT5i8sFIqyzAGSj2c
|
||||
88ZD4iK2SJAHv+lsKftehAwkLX1ORiushXQnXv2jhydlllHuP4UKkwPAGp0vLjbZHoBiWHv2zv1O
|
||||
czsiYx75xx1XgJSGYAJqnkoaPcbQ2iHwN3bUbdqf4L/bbO8KOa59xYMsHgyJ3ORHYVql6yxvzvbA
|
||||
h1pGCLs+paBi36gqrbsGUGw5MhnjntZ9e0BQutezX8i/osLKn/rSoTY7uAiptZH09vzfkZ3glScq
|
||||
VV6pdj6sd13N0A8vZCU+4pLNR+i4LRhiVyX7m0YH+4KuMLRbgX+1pu8vjPK6YsRqt07mff+gmsMr
|
||||
qjVfnzOPci0KcGMJeBKucwoxRfAYsecYp7tIhSZbB+QyrnMG5YTPwK67ooexQGinUPMnmRS9E56W
|
||||
qdHPU3L9+eQekraX/gJ3COx4cGzyCMTcOKYptEf6y2+ba1Z4p7MJqNBC5ZhjJ1WRBQtQEtj8c1nW
|
||||
72UfOm0x0IFvKXXRoeNxemn1WWcrKjp1RZ0c/Ok0C2OOUrhBtW+giF2vlM9RF/ZuPBndxoQsSKIx
|
||||
NYxW6hkL7U3DD1fprJNDgFsL/AW+QdSaOiJ7xfoGYpJb6o6cbq8MUzk5UmQR0+tKdZbY9p/PtgdX
|
||||
eujz6Yqc0mLVc1pEY65kpFUQ/o2lK31d3z7gqP4MSDx3mwwdnavT=
|
||||
HR+cPsEd9A9DZPsLhH2nWMCqUTgocbjtnw+Tyl2m/B6j/oY9J+HkM7mCTqKMd+/se7hf8A7vLaUG
|
||||
pjDM+6x09OeEP7ROSW7uGkjuDnVAOFBkFNqVsPshnE1OubB0lqIlry3NuCeDmk6LAvFjp6wAISvV
|
||||
KNIIbt0sruCcUFFT5s9R1k+u13if0vXhHxEJ3wxpihRA3uAbMtMUkVuFBKT30e7gtZb8/g4BGIIh
|
||||
72JByotTfj6lg9R3UE08hLuzU7uNYJB/RLfgpsrsPYLk04Bj6ZltC0JjyD/9ctXALfHfzfLqW8en
|
||||
Du48VyYzxp9mBT2QJDt/3XDN3yaep4r8UtuTPoa8fb+OGZfh0eapfxBwM5GLlE52d0cNfbitdSpY
|
||||
Wg8UOuWnJpZQ4gVwkrY4E2EURFwD06TPJnIq5/97fCVqBPvRJRSgxdjsfUZBfuD6ZqH5lFjmEMyC
|
||||
v7k9ZVTa2/CUKG0hq7ajuOXXJFUBicuWTZ3pux2bSrFRX7TMcLLNZ3lz3ykjDuGt/0NpOX5n/Qy8
|
||||
YfpyBN+LX9S4kHqFcYrgR1T1Lpdk/kq07L6tvl/P/koVkZN2/ZtkpYkmpANGLw083C8T7Tm3R0w9
|
||||
3B4Bc1Fx9ebWMUqDGR8UhVlwgjoYrpRk89l1+77qbZYYV1mfowo/LKzs1hmkueQ292cDtJcKRCeT
|
||||
L+H/aiBECRJBDao7bfRz9UUwMIyEmKKITkqCNSxrXXWPdj2xhgoUkIJmiPR8e3hS0qwqdPnjhALU
|
||||
tSZdsQcCRhF7eMMsbPjGeXd5cUd7Nq54TGLFwQkyH9Nu6IP64qh0GtD7JvzL6RkOfT4/jn7bp1fG
|
||||
E7VjEMMDqPuQ7C4KBQ+9nfdYFIOYg5cUeAgBRZObfwFqnLwFx7i105FGS0KOSIBKHMraYVvm1Mcu
|
||||
S9rxFbS8l5wNNVmTymWl77389mUFuqHWSqZx5hZOhSfiA/hr6+GZD+Cduv2NE939cUb3V4P95tr5
|
||||
VjZnDq8grxECLBFgVJJ5mwtkU+ZUhv/ElcipHFhOlXk562YUBXjJ/iSFI9nN+XaJCfEuJdw2JlGK
|
||||
5wkzNP8llv3eIuAH9+J4umh7sZHzxEFzy/4hgC/vMJKrY63dh9n/MGR+UXYXz7cfvsM08hKHCg5y
|
||||
I5dZegkkbpHmGFsbs/5v2perqXn+ON7AwlH2YYCbTZ0x7bCP/dh65pgV6OA932iXviCEww/Aswy0
|
||||
8QIjflY1d28uidRnwS8d0PoGgcY+VusopeRErUEMQhs9Yaqc6egLsBubwsQH8Er0DWLhm9HUWa11
|
||||
4vr6cuYaqJgSw18JAo9D3FjcIiG/R9kag2v5NWA3oGknX/vWaKiSFojy3S6+botWqMiCFIyUsW+L
|
||||
LQUMrCKfotB8I+hW9DCp/7vaDM0IukxQDcxtdEv7fB46KIVoODaLluY054CObnNAiyGVts3glX97
|
||||
kP97BTWGqx0nZhwtuBpZIkBr/Z4nxX10mvSV4CkLbcBKMCyoaROImtx/zTnV3Ny/Mk3l8B4LTeO5
|
||||
48Jvxnbz7RjUj71FS9E0Hf6ow09bhcngA+1CSGLpCo2fUiLYrDPqFQzqFMDwQCCUAjdNbXnhv3wD
|
||||
j5uP9gZKQ2vNVVlNemnctL1FYO6DIw69bMQHYBtlN5zourEqb6uorJATLPF1WiFkWQFjUz9dTdPl
|
||||
1NvvaGxZN+Ge0Gw+/B1FY52I6h/xge7WWuqXED+9FaIUbfQD+NGPOaGdrVyxdsaXFn4Q97rdw9l9
|
||||
Wmy6YVkVq96oBGtAOke1O498U0mUxlukvz9ChF9pJdUlUVGjIRS9ivpi6joNW1zWrpe++hEh58Xc
|
||||
oZzCagL+XQGsC+XX5boCxlVir+tpErChXtW7mprlC1PR5jqvsfbe3HXAckrBzA3m2KvpgG/eR6jB
|
||||
o3xS+0QyqqSUHIbu2ssRQjkR/efwrgz8o7fT79vgsnktluZezPkduAjQsKiZdoFZZ9PW5gA0Qm9e
|
||||
vlviLwkPEn8CUmZuIBk/VAzMbBozP8dZXPNiekixm6e4ZWemT6wcn4twSKy7roERPFE7KdY8/wNX
|
||||
wampv2c00qNUGXm6LAGAaiByFW4t2XLJ6ejACn5+cYLnj/NxK8j166lXpklDSAFCdOPc9aEsJ/uT
|
||||
iLRAiyJ9cUA+c9ZosndFHSckR36TjXILtSs68lByhWq1Sis/pgSWZdb5u9qs/v5qCHUEoMkyp5gt
|
||||
6PfnX1UW7z2x1+lBOiCzBuwV15fKNQ1po5AaaCNfYTmHd5Bd+AJhlO04xfXb5HsV4B4sK+h4cWFd
|
||||
h9COz0aS45A8Cuj1vN4vns4SJST9V8tMV63p1KLV4/FfhDMCmhbvU0kttUyKiLKUsKHKySibIKzE
|
||||
wSy2kqzuCghz3Cxj523NUHz9EpjvuacmGu8Ck7yRLc3e0oaGVp3hLn+1EK+yblvbe48lIIaaK99O
|
||||
DLOwxcpbC1KxaaMywO8nWhMtUfEB5JENjy1+CMW5x/PcA9kQPq4FXcVzHIP7rVuwe6fpe99Jxcwq
|
||||
bCkqkiiuqUxokI0Uy5DYQWSusPjZBJCRt22xVNeAxGXOQtL0ScZQUB9vpIE/RfIb6XtT5VP56I4+
|
||||
OONPvLuYixV/WnUH/SMPzZM7Hb4TbwA+3T8eArdorUPlSs/Msg6l2NHScarqEM7FWS+HksgeDXvd
|
||||
NZ4dzdHVG7lB4WfBnIhXIroaMxeBWDavnD709V0XNAYWi43LSyRUEDAd1FSA6oINm0dUMwDNq71Y
|
||||
PJcVKxf1WPUo92Wxwq0qAFkaQpEWRL0Anjtyep6Z/MV6k7uJK6Lcjzg884mAXkxL9Fx45zeMdW5k
|
||||
gtEblXqt3lKkb6niu/gb1uP4qS9xoxXVLUbbGCvPT7PruFwIekltYGNCa6X9c+4BgfH9DnmC5hC3
|
||||
hNQuciTnTlAoWUHmWaIWN/n3TqUMgmzMbt1a3DAYqAWYeUhmJnrrb8HNB1ehqwxob9/0XC8GjG58
|
||||
pfGnits6tjOKVOgcZ8pNK8eQSUW1ummor87F02LGM9s2qz+tVetze7HtBtsYw3A6U5aVgaIWun/s
|
||||
6oYctsdrzkI23W2/4E2k/sLLhVYRLZuTGY+9vmYv0lOzYrmR/nsqC1C2Uk6nshRFvpUyyoF5NNt8
|
||||
mJ7EoCrGznV+lnpI9Of4/TL3i8OwuTtKN+/9/53h0WBa+IPsO6XOUzEGJIWlo3r3e4lMQbJjB46a
|
||||
brtm2LqBdvm0V2DT/V96buBSKH1Wn20nJaVErvg7AaUnfVWNFxHcLpsG/A3B/3vDRimlhtjPrjlt
|
||||
lOhm1rqxBAt2ex/tEsRwrBnbcm5N+KCOdwvFO8WtYOJlTPgIymQZWRXNLvTrTMr2klpSI6CpdF/j
|
||||
PBp5bouprbMFnjMdO3KMK+TFZs5rP3yLq/E0EIcQ8NeThxZ7hpkGmEqLsqynOQdZ29nrALAd3ACS
|
||||
gd6iofCH6OEvaULxhTP0GDijmLrvxIXc7mlZRRPcf6LCm91vHWQbPVFcbQibKMuPV9axCToy5A4i
|
||||
VTm/YiN1IJwZn5YyLiT9GnlmyhNH82t+YqMYAsKjt7BcnYz27DvgCldetPs2Hi3LCjzXyu5747d6
|
||||
OTu4hAe0MRUJreqC57facQRRoHu0BR+gco2YOg0hMcckKdzWoC3wws3P/mBT5AvGoqJJpM9TxRn/
|
||||
FOKFt7Qe1k7VV5SpYaqAATs1+tre6ZzPGj7p7EmU7neYSWGqiAiAl+9tux9K87XlsgsjC3B8hGAL
|
||||
Gxedp/kq
|
||||
<?php
|
||||
|
||||
namespace PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider;
|
||||
|
||||
use PShowSsoScoped\League\OAuth2\Client\Provider\ResourceOwnerInterface;
|
||||
|
||||
class KeycloakResourceOwner implements ResourceOwnerInterface
|
||||
{
|
||||
/**
|
||||
* Raw response
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $response;
|
||||
|
||||
/**
|
||||
* Creates new resource owner.
|
||||
*
|
||||
* @param array $response
|
||||
*/
|
||||
public function __construct(array $response = array())
|
||||
{
|
||||
$this->response = $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get resource owner id
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getId()
|
||||
{
|
||||
return \array_key_exists('sub', $this->response) ? $this->response['sub'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get resource owner email
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getEmail()
|
||||
{
|
||||
return \array_key_exists('email', $this->response) ? $this->response['email'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get resource owner name
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return \array_key_exists('name', $this->response) ? $this->response['name'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get resource owner username
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getUsername()
|
||||
{
|
||||
return \array_key_exists('preferred_username', $this->response) ? $this->response['preferred_username'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get resource owner first name
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getFirstName()
|
||||
{
|
||||
return \array_key_exists('given_name', $this->response) ? $this->response['given_name'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get resource owner last name
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getLastName()
|
||||
{
|
||||
return \array_key_exists('family_name', $this->response) ? $this->response['family_name'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all of the owner details available as an array.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
return $this->response;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,564 @@
|
||||
<?php
|
||||
|
||||
namespace
|
||||
{
|
||||
$mockFileGetContents = null;
|
||||
}
|
||||
|
||||
namespace Stevenmaguire\OAuth2\Client\Provider
|
||||
{
|
||||
function file_get_contents()
|
||||
{
|
||||
global $mockFileGetContents;
|
||||
if (isset($mockFileGetContents) && ! is_null($mockFileGetContents)) {
|
||||
if (is_a($mockFileGetContents, 'Exception')) {
|
||||
throw $mockFileGetContents;
|
||||
}
|
||||
return $mockFileGetContents;
|
||||
} else {
|
||||
return call_user_func_array('\file_get_contents', func_get_args());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace Stevenmaguire\OAuth2\Client\Test\Provider
|
||||
{
|
||||
use DateInterval;
|
||||
use DateTimeImmutable;
|
||||
use Firebase\JWT\JWT;
|
||||
use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
|
||||
use League\OAuth2\Client\Token\AccessToken;
|
||||
use League\OAuth2\Client\Tool\QueryBuilderTrait;
|
||||
use Mockery as m;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Psr\Http\Message\StreamInterface;
|
||||
use Stevenmaguire\OAuth2\Client\Provider\Exception\EncryptionConfigurationException;
|
||||
use Stevenmaguire\OAuth2\Client\Provider\Keycloak;
|
||||
|
||||
class KeycloakTest extends TestCase
|
||||
{
|
||||
use QueryBuilderTrait;
|
||||
|
||||
public const ENCRYPTION_KEY = <<<EOD
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8kGa1pSjbSYZVebtTRBLxBz5H
|
||||
4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t
|
||||
0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4
|
||||
ehde/zUxo6UvS7UrBQIDAQAB
|
||||
-----END PUBLIC KEY-----
|
||||
EOD;
|
||||
|
||||
public const ENCRYPTION_ALGORITHM = 'HS256';
|
||||
|
||||
private $jwtTemplate = <<<EOF
|
||||
{
|
||||
"exp": "%s",
|
||||
"iat": "%s",
|
||||
"jti": "e11a85c8-aa91-4f75-9088-57db4586f8b9",
|
||||
"iss": "https://example.org/auth/realms/test-realm",
|
||||
"aud": "account",
|
||||
"nbf": "%s",
|
||||
"sub": "4332085e-b944-4acc-9eb1-27d8f5405f3e",
|
||||
"typ": "Bearer",
|
||||
"azp": "test-app",
|
||||
"session_state": "c90c8e0d-aabb-4c71-b8a8-e88792cacd96",
|
||||
"acr": "1",
|
||||
"realm_access": {
|
||||
"roles": [
|
||||
"default-roles-test-realm",
|
||||
"offline_access",
|
||||
"uma_authorization"
|
||||
]
|
||||
},
|
||||
"resource_access": {
|
||||
"account": {
|
||||
"roles": [
|
||||
"manage-account",
|
||||
"manage-account-links",
|
||||
"view-profile"
|
||||
]
|
||||
}
|
||||
},
|
||||
"scope": "openid email profile",
|
||||
"sid": "c90c8e0d-aabb-4c71-b8a8-e88792cacd96",
|
||||
"address": {},
|
||||
"email_verified": true,
|
||||
"name": "Test User",
|
||||
"preferred_username": "test-user",
|
||||
"given_name": "Test",
|
||||
"family_name": "User",
|
||||
"email": "test-user@example.org"
|
||||
}
|
||||
EOF;
|
||||
|
||||
protected $provider;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
$this->provider = new Keycloak([
|
||||
'authServerUrl' => 'http://mock.url/auth',
|
||||
'realm' => 'mock_realm',
|
||||
'clientId' => 'mock_client_id',
|
||||
'clientSecret' => 'mock_secret',
|
||||
'redirectUri' => 'none',
|
||||
]);
|
||||
}
|
||||
|
||||
public function tearDown(): void
|
||||
{
|
||||
m::close();
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
public function testAuthorizationUrl()
|
||||
{
|
||||
$url = $this->provider->getAuthorizationUrl();
|
||||
$uri = parse_url($url);
|
||||
parse_str($uri['query'], $query);
|
||||
|
||||
$this->assertArrayHasKey('client_id', $query);
|
||||
$this->assertArrayHasKey('redirect_uri', $query);
|
||||
$this->assertArrayHasKey('state', $query);
|
||||
$this->assertArrayHasKey('scope', $query);
|
||||
$this->assertArrayHasKey('response_type', $query);
|
||||
$this->assertArrayHasKey('approval_prompt', $query);
|
||||
$this->assertNotNull($this->provider->getState());
|
||||
}
|
||||
|
||||
public function testEncryptionAlgorithm()
|
||||
{
|
||||
$algorithm = uniqid();
|
||||
$provider = new Keycloak([
|
||||
'encryptionAlgorithm' => $algorithm,
|
||||
]);
|
||||
|
||||
$this->assertEquals($algorithm, $provider->encryptionAlgorithm);
|
||||
|
||||
$algorithm = uniqid();
|
||||
$provider->setEncryptionAlgorithm($algorithm);
|
||||
|
||||
$this->assertEquals($algorithm, $provider->encryptionAlgorithm);
|
||||
}
|
||||
|
||||
public function testEncryptionKey()
|
||||
{
|
||||
$key = uniqid();
|
||||
$provider = new Keycloak([
|
||||
'encryptionKey' => $key,
|
||||
]);
|
||||
|
||||
$this->assertEquals($key, $provider->encryptionKey);
|
||||
|
||||
$key = uniqid();
|
||||
$provider->setEncryptionKey($key);
|
||||
|
||||
$this->assertEquals($key, $provider->encryptionKey);
|
||||
}
|
||||
|
||||
public function testEncryptionKeyPath()
|
||||
{
|
||||
global $mockFileGetContents;
|
||||
$path = uniqid();
|
||||
$key = uniqid();
|
||||
$mockFileGetContents = $key;
|
||||
|
||||
$provider = new Keycloak([
|
||||
'encryptionKeyPath' => $path,
|
||||
]);
|
||||
|
||||
$this->assertEquals($key, $provider->encryptionKey);
|
||||
|
||||
$path = uniqid();
|
||||
$key = uniqid();
|
||||
$mockFileGetContents = $key;
|
||||
|
||||
$provider->setEncryptionKeyPath($path);
|
||||
|
||||
$this->assertEquals($key, $provider->encryptionKey);
|
||||
}
|
||||
|
||||
public function testEncryptionKeyPathFails()
|
||||
{
|
||||
$this->markTestIncomplete('Need to assess the test to see what is required to be checked.');
|
||||
|
||||
global $mockFileGetContents;
|
||||
$path = uniqid();
|
||||
$key = uniqid();
|
||||
$mockFileGetContents = new \Exception();
|
||||
|
||||
$provider = new Keycloak([
|
||||
'encryptionKeyPath' => $path,
|
||||
]);
|
||||
|
||||
$provider->setEncryptionKeyPath($path);
|
||||
}
|
||||
|
||||
public function testScopes()
|
||||
{
|
||||
$scopeSeparator = ' ';
|
||||
$options = ['scope' => [uniqid(), uniqid()]];
|
||||
$query = ['scope' => implode($scopeSeparator, $options['scope'])];
|
||||
$url = $this->provider->getAuthorizationUrl($options);
|
||||
$encodedScope = $this->buildQueryString($query);
|
||||
$this->assertStringContainsString($encodedScope, $url);
|
||||
}
|
||||
|
||||
public function testGetAuthorizationUrl()
|
||||
{
|
||||
$url = $this->provider->getAuthorizationUrl();
|
||||
$uri = parse_url($url);
|
||||
|
||||
$this->assertEquals('/auth/realms/mock_realm/protocol/openid-connect/auth', $uri['path']);
|
||||
}
|
||||
|
||||
public function testGetLogoutUrl()
|
||||
{
|
||||
$url = $this->provider->getLogoutUrl();
|
||||
$uri = parse_url($url);
|
||||
|
||||
$this->assertEquals('/auth/realms/mock_realm/protocol/openid-connect/logout', $uri['path']);
|
||||
}
|
||||
|
||||
public function testGetLogoutUrlWithIdTokenHint()
|
||||
{
|
||||
$this->provider->setVersion('18.0.0');
|
||||
|
||||
$options = [
|
||||
'access_token' => new AccessToken(
|
||||
[
|
||||
'id_token' => 'the_id_token',
|
||||
'access_token' => 'the_access_token',
|
||||
]
|
||||
),
|
||||
];
|
||||
$url = $this->provider->getLogoutUrl($options);
|
||||
$uri = parse_url($url);
|
||||
|
||||
$this->assertEquals('/auth/realms/mock_realm/protocol/openid-connect/logout', $uri['path']);
|
||||
$this->assertStringContainsString('id_token_hint=the_id_token', $uri['query']);
|
||||
}
|
||||
|
||||
public function testGetBaseAccessTokenUrl()
|
||||
{
|
||||
$params = [];
|
||||
|
||||
$url = $this->provider->getBaseAccessTokenUrl($params);
|
||||
$uri = parse_url($url);
|
||||
|
||||
$this->assertEquals('/auth/realms/mock_realm/protocol/openid-connect/token', $uri['path']);
|
||||
}
|
||||
|
||||
public function testGetAccessToken()
|
||||
{
|
||||
$stream = $this->createMock(StreamInterface::class);
|
||||
$stream
|
||||
->method('__toString')
|
||||
->willReturn('{"access_token":"mock_access_token","scope":"email","token_type":"bearer"}');
|
||||
|
||||
$response = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$response
|
||||
->shouldReceive('getBody')
|
||||
->andReturn($stream);
|
||||
$response
|
||||
->shouldReceive('getHeader')
|
||||
->andReturn(['content-type' => 'json']);
|
||||
|
||||
$client = m::mock('GuzzleHttp\ClientInterface');
|
||||
$client->shouldReceive('send')
|
||||
->times(1)
|
||||
->andReturn($response);
|
||||
$this->provider->setHttpClient($client);
|
||||
|
||||
$token = $this
|
||||
->provider
|
||||
->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
|
||||
|
||||
$this->assertEquals('mock_access_token', $token->getToken());
|
||||
$this->assertNull($token->getExpires());
|
||||
$this->assertNull($token->getRefreshToken());
|
||||
$this->assertNull($token->getResourceOwnerId());
|
||||
}
|
||||
|
||||
public function testUserData()
|
||||
{
|
||||
$userId = rand(1000, 9999);
|
||||
$name = uniqid();
|
||||
$email = uniqid();
|
||||
$username = uniqid();
|
||||
$firstName = uniqid();
|
||||
$lastName = uniqid();
|
||||
|
||||
$getAccessTokenResponseStream = $this->createMock(StreamInterface::class);
|
||||
$getAccessTokenResponseStream
|
||||
->method('__toString')
|
||||
->willReturn(
|
||||
'{"access_token":"mock_access_token","expires":"3600","refresh_token":"mock_refresh_token","otherKey":[1234]}'
|
||||
);
|
||||
|
||||
$postResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$postResponse
|
||||
->shouldReceive('getBody')
|
||||
->andReturn($getAccessTokenResponseStream);
|
||||
$postResponse
|
||||
->shouldReceive('getHeader')
|
||||
->andReturn(['content-type' => 'json']);
|
||||
|
||||
$getResourceOwnerResponseStream = $this->createMock(StreamInterface::class);
|
||||
$getResourceOwnerResponseStream
|
||||
->method('__toString')
|
||||
->willReturn(
|
||||
sprintf(
|
||||
'{"sub": "%s", "name": "%s", "email": "%s", "preferred_username": "%s", "given_name": "%s", "family_name": "%s"}',
|
||||
$userId,
|
||||
$name,
|
||||
$email,
|
||||
$username,
|
||||
$firstName,
|
||||
$lastName
|
||||
)
|
||||
);
|
||||
|
||||
$userResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$userResponse
|
||||
->shouldReceive('getBody')
|
||||
->andReturn($getResourceOwnerResponseStream);
|
||||
$userResponse
|
||||
->shouldReceive('getHeader')
|
||||
->andReturn(['content-type' => 'json']);
|
||||
|
||||
$client = m::mock('GuzzleHttp\ClientInterface');
|
||||
$client
|
||||
->shouldReceive('send')
|
||||
->andReturn($postResponse, $userResponse);
|
||||
$this->provider->setHttpClient($client);
|
||||
|
||||
$token = $this->provider->getAccessToken(
|
||||
'authorization_code',
|
||||
[
|
||||
'code' => 'mock_authorization_code',
|
||||
'access_token' => 'mock_access_token',
|
||||
]
|
||||
);
|
||||
$user = $this->provider->getResourceOwner($token);
|
||||
|
||||
$this->assertEquals($userId, $user->getId());
|
||||
$this->assertEquals($userId, $user->toArray()['sub']);
|
||||
$this->assertEquals($name, $user->getName());
|
||||
$this->assertEquals($name, $user->toArray()['name']);
|
||||
$this->assertEquals($email, $user->getEmail());
|
||||
$this->assertEquals($email, $user->toArray()['email']);
|
||||
$this->assertEquals($username, $user->getUsername());
|
||||
$this->assertEquals($username, $user->toArray()['preferred_username']);
|
||||
$this->assertEquals($firstName, $user->getFirstName());
|
||||
$this->assertEquals($firstName, $user->toArray()['given_name']);
|
||||
$this->assertEquals($lastName, $user->getLastName());
|
||||
$this->assertEquals($lastName, $user->toArray()['family_name']);
|
||||
}
|
||||
|
||||
public function testUserDataWithEncryption()
|
||||
{
|
||||
$jwt = JWT::encode(
|
||||
json_decode(
|
||||
sprintf(
|
||||
$this->jwtTemplate,
|
||||
(new DateTimeImmutable())->add(new DateInterval('PT1H'))->getTimestamp(),
|
||||
(new DateTimeImmutable())->sub(new DateInterval('P1D'))->getTimestamp(),
|
||||
(new DateTimeImmutable())->sub(new DateInterval('P1D'))->getTimestamp()
|
||||
),
|
||||
true
|
||||
),
|
||||
self::ENCRYPTION_KEY,
|
||||
self::ENCRYPTION_ALGORITHM
|
||||
);
|
||||
|
||||
$getAccessTokenResponseStream = $this->createMock(StreamInterface::class);
|
||||
$getAccessTokenResponseStream
|
||||
->method('__toString')
|
||||
->willReturn(
|
||||
sprintf(
|
||||
'{"access_token":"%s","expires":"3600","refresh_token":"mock_refresh_token","otherKey":[1234]}',
|
||||
$jwt
|
||||
)
|
||||
);
|
||||
|
||||
$accessTokenResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$accessTokenResponse
|
||||
->shouldReceive('getBody')
|
||||
->andReturn($getAccessTokenResponseStream);
|
||||
$accessTokenResponse
|
||||
->shouldReceive('getHeader')
|
||||
->andReturn(['content-type' => 'json']);
|
||||
$accessTokenResponse
|
||||
->shouldReceive('getStatusCode')
|
||||
->andReturn(200);
|
||||
|
||||
$getResourceOwnerResponseStream = $this->createMock(StreamInterface::class);
|
||||
$getResourceOwnerResponseStream
|
||||
->method('__toString')
|
||||
->willReturn($jwt);
|
||||
|
||||
$resourceOwnerResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$resourceOwnerResponse
|
||||
->shouldReceive('getBody')
|
||||
->andReturn($getResourceOwnerResponseStream);
|
||||
$resourceOwnerResponse
|
||||
->shouldReceive('getHeader')
|
||||
->andReturn(['content-type' => 'application/jwt']);
|
||||
$resourceOwnerResponse
|
||||
->shouldReceive('getStatusCode')
|
||||
->andReturn(200);
|
||||
|
||||
$client = m::mock('GuzzleHttp\ClientInterface');
|
||||
$client
|
||||
->shouldReceive('send')
|
||||
->times(2)
|
||||
->andReturn($accessTokenResponse, $resourceOwnerResponse);
|
||||
$this->provider->setHttpClient($client);
|
||||
|
||||
$token = $this
|
||||
->provider
|
||||
->setEncryptionAlgorithm(self::ENCRYPTION_ALGORITHM)
|
||||
->setEncryptionKey(self::ENCRYPTION_KEY)
|
||||
->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
|
||||
$user = $this->provider->getResourceOwner($token);
|
||||
|
||||
$email = "test-user@example.org";
|
||||
$name = "Test User";
|
||||
$userId = "4332085e-b944-4acc-9eb1-27d8f5405f3e";
|
||||
$username = "test-user";
|
||||
$firstName = "Test";
|
||||
$lastName = "User";
|
||||
|
||||
$this->assertEquals($userId, $user->getId());
|
||||
$this->assertEquals($userId, $user->toArray()['sub']);
|
||||
$this->assertEquals($name, $user->getName());
|
||||
$this->assertEquals($name, $user->toArray()['name']);
|
||||
$this->assertEquals($email, $user->getEmail());
|
||||
$this->assertEquals($email, $user->toArray()['email']);
|
||||
$this->assertEquals($username, $user->getUsername());
|
||||
$this->assertEquals($username, $user->toArray()['preferred_username']);
|
||||
$this->assertEquals($firstName, $user->getFirstName());
|
||||
$this->assertEquals($firstName, $user->toArray()['given_name']);
|
||||
$this->assertEquals($lastName, $user->getLastName());
|
||||
$this->assertEquals($lastName, $user->toArray()['family_name']);
|
||||
}
|
||||
|
||||
public function testUserDataFailsWhenEncryptionEncounteredAndNotConfigured()
|
||||
{
|
||||
$this->expectException(EncryptionConfigurationException::class);
|
||||
|
||||
$accessTokenResponseStream = $this->createMock(StreamInterface::class);
|
||||
$accessTokenResponseStream
|
||||
->method('__toString')
|
||||
->willReturn(
|
||||
'{"access_token":"mock_access_token","expires":"3600","refresh_token":"mock_refresh_token","otherKey":[1234]}'
|
||||
);
|
||||
|
||||
$getAccessTokenResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$getAccessTokenResponse
|
||||
->shouldReceive('getBody')
|
||||
->andReturn($accessTokenResponseStream);
|
||||
$getAccessTokenResponse
|
||||
->shouldReceive('getHeader')
|
||||
->andReturn(['content-type' => 'json']);
|
||||
$getAccessTokenResponse
|
||||
->shouldReceive('getStatusCode')
|
||||
->andReturn(200);
|
||||
|
||||
$resourceOwnerResponseStream = $this->createMock(StreamInterface::class);
|
||||
$resourceOwnerResponseStream
|
||||
->method('__toString')
|
||||
->willReturn(uniqid());
|
||||
|
||||
$getResourceOwnerResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$getResourceOwnerResponse
|
||||
->shouldReceive('getBody')
|
||||
->andReturn($resourceOwnerResponseStream);
|
||||
$getResourceOwnerResponse
|
||||
->shouldReceive('getHeader')
|
||||
->andReturn(['content-type' => 'application/jwt']);
|
||||
$getResourceOwnerResponse
|
||||
->shouldReceive('getStatusCode')
|
||||
->andReturn(200);
|
||||
|
||||
$client = m::mock('GuzzleHttp\ClientInterface');
|
||||
$client
|
||||
->shouldReceive('send')
|
||||
->times(2)
|
||||
->andReturn($getAccessTokenResponse, $getResourceOwnerResponse);
|
||||
$this->provider->setHttpClient($client);
|
||||
|
||||
$token = $this->provider->getAccessToken(
|
||||
'authorization_code', #
|
||||
['code' => 'mock_authorization_code']
|
||||
);
|
||||
$user = $this->provider->getResourceOwner($token);
|
||||
}
|
||||
|
||||
public function testErrorResponse()
|
||||
{
|
||||
$this->expectException(IdentityProviderException::class);
|
||||
|
||||
$accessTokenResponseStream = $this->createMock(StreamInterface::class);
|
||||
$accessTokenResponseStream
|
||||
->method('__toString')
|
||||
->willReturn(
|
||||
'{"error": "invalid_grant", "error_description": "Code not found"}'
|
||||
);
|
||||
|
||||
$response = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$response
|
||||
->shouldReceive('getBody')
|
||||
->andReturn($accessTokenResponseStream);
|
||||
$response
|
||||
->shouldReceive('getHeader')
|
||||
$response
|
||||
->shouldReceive('getStatusCode')
|
||||
->andReturn(401);
|
||||
|
||||
$client = m::mock('GuzzleHttp\ClientInterface');
|
||||
$client
|
||||
->shouldReceive('send')
|
||||
->times(1)
|
||||
->andReturn($response);
|
||||
$this->provider->setHttpClient($client);
|
||||
|
||||
$token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
|
||||
}
|
||||
|
||||
public function testCanDecryptResponseThrowsExceptionIfResponseIsNotAStringAndEncryptionIsNotUsed()
|
||||
{
|
||||
$this->expectException(EncryptionConfigurationException::class);
|
||||
|
||||
$this->provider->decryptResponse('');
|
||||
|
||||
$this->assertFalse($this->provider->usesEncryption());
|
||||
}
|
||||
|
||||
public function testCanDecryptResponseReturnsResponseWhenEncryptionIsUsed()
|
||||
{
|
||||
$jwtPayload = json_decode(
|
||||
sprintf(
|
||||
$this->jwtTemplate,
|
||||
(new DateTimeImmutable())->add(new DateInterval('PT1H'))->getTimestamp(),
|
||||
(new DateTimeImmutable())->sub(new DateInterval('P1D'))->getTimestamp(),
|
||||
(new DateTimeImmutable())->sub(new DateInterval('P1D'))->getTimestamp()
|
||||
),
|
||||
true
|
||||
);
|
||||
$jwt = JWT::encode(
|
||||
$jwtPayload,
|
||||
self::ENCRYPTION_KEY,
|
||||
self::ENCRYPTION_ALGORITHM
|
||||
);
|
||||
|
||||
$this->provider
|
||||
->setEncryptionAlgorithm(self::ENCRYPTION_ALGORITHM)
|
||||
->setEncryptionKey(self::ENCRYPTION_KEY);
|
||||
|
||||
$response = $this->provider->decryptResponse($jwt);
|
||||
|
||||
$this->assertSame($jwtPayload, $response);
|
||||
}
|
||||
}
|
||||
}
|
||||
5
modules/pshowsso/deps/stevenmaguire/oauth2-microsoft/.gitignore
vendored
Normal file
5
modules/pshowsso/deps/stevenmaguire/oauth2-microsoft/.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
/build
|
||||
/vendor
|
||||
composer.phar
|
||||
composer.lock
|
||||
.DS_Store
|
||||
@@ -0,0 +1,35 @@
|
||||
filter:
|
||||
excluded_paths: [tests/*]
|
||||
checks:
|
||||
php:
|
||||
code_rating: true
|
||||
remove_extra_empty_lines: true
|
||||
remove_php_closing_tag: true
|
||||
remove_trailing_whitespace: true
|
||||
fix_use_statements:
|
||||
remove_unused: true
|
||||
preserve_multiple: false
|
||||
preserve_blanklines: true
|
||||
order_alphabetically: true
|
||||
fix_php_opening_tag: true
|
||||
fix_linefeed: true
|
||||
fix_line_ending: true
|
||||
fix_identation_4spaces: true
|
||||
fix_doc_comments: true
|
||||
tools:
|
||||
external_code_coverage:
|
||||
timeout: 600
|
||||
runs: 3
|
||||
php_analyzer: true
|
||||
php_code_coverage: false
|
||||
php_code_sniffer:
|
||||
config:
|
||||
standard: PSR2
|
||||
filter:
|
||||
paths: ['src']
|
||||
php_loc:
|
||||
enabled: true
|
||||
excluded_dirs: [vendor, tests]
|
||||
php_cpd:
|
||||
enabled: true
|
||||
excluded_dirs: [vendor, tests]
|
||||
@@ -0,0 +1,45 @@
|
||||
language: php
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- php: 5.6
|
||||
- php: 7.0
|
||||
- php: 7.1
|
||||
- php: nightly
|
||||
- php: hhvm-3.6
|
||||
sudo: required
|
||||
dist: trusty
|
||||
group: edge
|
||||
- php: hhvm-3.9
|
||||
sudo: required
|
||||
dist: trusty
|
||||
group: edge
|
||||
- php: hhvm-3.12
|
||||
sudo: required
|
||||
dist: trusty
|
||||
group: edge
|
||||
- php: hhvm-3.15
|
||||
sudo: required
|
||||
dist: trusty
|
||||
group: edge
|
||||
- php: hhvm-nightly
|
||||
sudo: required
|
||||
dist: trusty
|
||||
group: edge
|
||||
fast_finish: true
|
||||
allow_failures:
|
||||
- php: nightly
|
||||
- php: hhvm-nightly
|
||||
|
||||
before_script:
|
||||
- travis_retry composer self-update
|
||||
- travis_retry composer install --no-interaction --prefer-source --dev
|
||||
- travis_retry phpenv rehash
|
||||
|
||||
script:
|
||||
- ./vendor/bin/phpcs --standard=psr2 src/
|
||||
- ./vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover
|
||||
|
||||
after_script:
|
||||
- wget https://scrutinizer-ci.com/ocular.phar
|
||||
- php ocular.phar code-coverage:upload --format=php-clover coverage.clover
|
||||
@@ -0,0 +1,108 @@
|
||||
# Changelog
|
||||
All Notable changes to `oauth2-microsoft` will be documented in this file
|
||||
|
||||
## 2.2.0 - 2017-06-07
|
||||
|
||||
### Added
|
||||
- Nothing
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- Support for retrieving image urls.
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
|
||||
## 2.1.0 - 2017-06-04
|
||||
|
||||
### Added
|
||||
- Support for custom authorization urls, previous URLs serve as default values.
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- Nothing
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
|
||||
## 2.0.0 - 2017-01-25
|
||||
|
||||
### Added
|
||||
- PHP 7.1 Support
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- PHP 5.5 Support
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
|
||||
## 1.0.0 - 2017-01-25
|
||||
|
||||
Bump for base package parity
|
||||
|
||||
## 0.2.1 - 2015-11-12
|
||||
|
||||
### Added
|
||||
- Nothing
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Improved null checks in checkResponse method
|
||||
|
||||
### Removed
|
||||
- Nothing
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
|
||||
## 0.2.0 - 2015-08-20
|
||||
|
||||
### Added
|
||||
- Upgrade to support version 1.0 release of core client
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- Nothing
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
|
||||
## 0.1.0 - 2015-03-21
|
||||
|
||||
### Added
|
||||
- Initial release!
|
||||
|
||||
### Deprecated
|
||||
- Nothing
|
||||
|
||||
### Fixed
|
||||
- Nothing
|
||||
|
||||
### Removed
|
||||
- Nothing
|
||||
|
||||
### Security
|
||||
- Nothing
|
||||
@@ -0,0 +1,42 @@
|
||||
# Contributing
|
||||
|
||||
Contributions are **welcome** and will be fully **credited**.
|
||||
|
||||
We accept contributions via Pull Requests on [Github](https://github.com/stevenmaguire/oauth2-microsoft).
|
||||
|
||||
|
||||
## Pull Requests
|
||||
|
||||
- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer).
|
||||
|
||||
- **Add tests!** - Your patch won't be accepted if it doesn't have tests.
|
||||
|
||||
- **Document any change in behaviour** - Make sure the README and any other relevant documentation are kept up-to-date.
|
||||
|
||||
- **Consider our release cycle** - We try to follow SemVer. Randomly breaking public APIs is not an option.
|
||||
|
||||
- **Create topic branches** - Don't ask us to pull from your master branch.
|
||||
|
||||
- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests.
|
||||
|
||||
- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please squash them before submitting.
|
||||
|
||||
- **Ensure tests pass!** - Please run the tests (see below) before submitting your pull request, and make sure they pass. We won't accept a patch until all tests pass.
|
||||
|
||||
- **Ensure no coding standards violations** - Please run PHP Code Sniffer using the PSR-2 standard (see below) before submitting your pull request. A violation will cause the build to fail, so please make sure there are no violations. We can't accept a patch if the build fails.
|
||||
|
||||
|
||||
## Running Tests
|
||||
|
||||
``` bash
|
||||
$ ./vendor/bin/phpunit
|
||||
```
|
||||
|
||||
|
||||
## Running PHP Code Sniffer
|
||||
|
||||
``` bash
|
||||
$ ./vendor/bin/phpcs src --standard=psr2 -sp
|
||||
```
|
||||
|
||||
**Happy coding**!
|
||||
140
modules/pshowsso/deps/stevenmaguire/oauth2-microsoft/README.md
Normal file
140
modules/pshowsso/deps/stevenmaguire/oauth2-microsoft/README.md
Normal file
@@ -0,0 +1,140 @@
|
||||
# Microsoft Provider for OAuth 2.0 Client
|
||||
[](https://github.com/stevenmaguire/oauth2-microsoft/releases)
|
||||
[](https://travis-ci.org/stevenmaguire/oauth2-microsoft)
|
||||
[](https://scrutinizer-ci.com/g/stevenmaguire/oauth2-microsoft/code-structure)
|
||||
[](https://scrutinizer-ci.com/g/stevenmaguire/oauth2-microsoft)
|
||||
[](https://packagist.org/packages/stevenmaguire/oauth2-microsoft)
|
||||
[](LICENSE.md)
|
||||
|
||||
This package provides Microsoft OAuth 2.0 support for the PHP League's [OAuth 2.0 Client](https://github.com/thephpleague/oauth2-client).
|
||||
|
||||
## Installation
|
||||
|
||||
To install, use composer:
|
||||
|
||||
```
|
||||
composer require stevenmaguire/oauth2-microsoft
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Usage is the same as The League's OAuth client, using `\Stevenmaguire\OAuth2\Client\Provider\Microsoft` as the provider.
|
||||
|
||||
### Authorization Code Flow
|
||||
|
||||
```php
|
||||
$provider = new Stevenmaguire\OAuth2\Client\Provider\Microsoft([
|
||||
// Required
|
||||
'clientId' => '{microsoft-client-id}',
|
||||
'clientSecret' => '{microsoft-client-secret}',
|
||||
'redirectUri' => 'https://example.com/callback-url',
|
||||
// Optional
|
||||
'urlAuthorize' => 'https://login.windows.net/common/oauth2/authorize',
|
||||
'urlAccessToken' => 'https://login.windows.net/common/oauth2/token',
|
||||
'urlResourceOwnerDetails' => 'https://outlook.office.com/api/v1.0/me'
|
||||
]);
|
||||
|
||||
if (!isset($_GET['code'])) {
|
||||
|
||||
// If we don't have an authorization code then get one
|
||||
$authUrl = $provider->getAuthorizationUrl();
|
||||
$_SESSION['oauth2state'] = $provider->getState();
|
||||
header('Location: '.$authUrl);
|
||||
exit;
|
||||
|
||||
// Check given state against previously stored one to mitigate CSRF attack
|
||||
} elseif (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
|
||||
|
||||
unset($_SESSION['oauth2state']);
|
||||
exit('Invalid state');
|
||||
|
||||
} else {
|
||||
|
||||
// Try to get an access token (using the authorization code grant)
|
||||
$token = $provider->getAccessToken('authorization_code', [
|
||||
'code' => $_GET['code']
|
||||
]);
|
||||
|
||||
// Optional: Now you have a token you can look up a users profile data
|
||||
try {
|
||||
|
||||
// We got an access token, let's now get the user's details
|
||||
$user = $provider->getResourceOwner($token);
|
||||
|
||||
// Use these details to create a new profile
|
||||
printf('Hello %s!', $user->getFirstname());
|
||||
|
||||
} catch (Exception $e) {
|
||||
|
||||
// Failed to get user details
|
||||
exit('Oh dear...');
|
||||
}
|
||||
|
||||
// Use this to interact with an API on the users behalf
|
||||
echo $token->getToken();
|
||||
}
|
||||
```
|
||||
|
||||
#### Managing Scopes and State
|
||||
|
||||
When creating your Microsoft authorization URL, you can specify the state and scopes your application may authorize.
|
||||
|
||||
```php
|
||||
$options = [
|
||||
'state' => 'OPTIONAL_CUSTOM_CONFIGURED_STATE',
|
||||
'scope' => ['wl.basic', 'wl.signin'] // array or string
|
||||
];
|
||||
|
||||
$authorizationUrl = $provider->getAuthorizationUrl($options);
|
||||
```
|
||||
If neither are defined, the provider will utilize internal defaults.
|
||||
|
||||
At the time of authoring this documentation, the following scopes are available.
|
||||
|
||||
##### Core
|
||||
- wl.basic
|
||||
- wl.offline_access
|
||||
- wl.signin
|
||||
|
||||
##### Extended
|
||||
- wl.birthday
|
||||
- wl.calendars
|
||||
- wl.calendars_update
|
||||
- wl.contacts_birthday
|
||||
- wl.contacts_create
|
||||
- wl.contacts_calendars
|
||||
- wl.contacts_photos
|
||||
- wl.contacts_skydrive
|
||||
- wl.emails
|
||||
- wl.events_create
|
||||
- wl.imap
|
||||
- wl.phone_numbers
|
||||
- wl.photos
|
||||
- wl.postal_addresses
|
||||
- wl.skydrive
|
||||
- wl.skydrive_update
|
||||
- wl.work_profile
|
||||
- office.onenote_create
|
||||
|
||||
|
||||
## Testing
|
||||
|
||||
``` bash
|
||||
$ ./vendor/bin/phpunit
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
Please see [CONTRIBUTING](https://github.com/stevenmaguire/oauth2-microsoft/blob/master/CONTRIBUTING.md) for details.
|
||||
|
||||
|
||||
## Credits
|
||||
|
||||
- [Steven Maguire](https://github.com/stevenmaguire)
|
||||
- [All Contributors](https://github.com/stevenmaguire/oauth2-microsoft/contributors)
|
||||
|
||||
|
||||
## License
|
||||
|
||||
The MIT License (MIT). Please see [License File](https://github.com/stevenmaguire/oauth2-microsoft/blob/master/LICENSE) for more information.
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "stevenmaguire/oauth2-microsoft",
|
||||
"description": "Microsoft OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
|
||||
"license": "MIT",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Steven Maguire",
|
||||
"email": "stevenmaguire@gmail.com",
|
||||
"homepage": "https://github.com/stevenmaguire"
|
||||
}
|
||||
],
|
||||
"keywords": [
|
||||
"oauth",
|
||||
"oauth2",
|
||||
"client",
|
||||
"authorization",
|
||||
"authorisation",
|
||||
"microsoft"
|
||||
],
|
||||
"require": {
|
||||
"league/oauth2-client": "^2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "~4.0",
|
||||
"mockery/mockery": "~0.9",
|
||||
"squizlabs/php_codesniffer": "~2.0"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Stevenmaguire\\OAuth2\\Client\\": "src/"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"Stevenmaguire\\OAuth2\\Client\\Test\\": "tests/src/"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<phpunit backupGlobals="false"
|
||||
backupStaticAttributes="false"
|
||||
bootstrap="vendor/autoload.php"
|
||||
colors="true"
|
||||
convertErrorsToExceptions="true"
|
||||
convertNoticesToExceptions="true"
|
||||
convertWarningsToExceptions="true"
|
||||
processIsolation="false"
|
||||
stopOnFailure="false"
|
||||
syntaxCheck="false"
|
||||
>
|
||||
<logging>
|
||||
<log type="coverage-html"
|
||||
target="./build/coverage/html"
|
||||
charset="UTF-8"
|
||||
highlight="false"
|
||||
lowUpperBound="35"
|
||||
highLowerBound="70"/>
|
||||
<log type="coverage-clover"
|
||||
target="./build/coverage/log/coverage.xml"/>
|
||||
</logging>
|
||||
<testsuites>
|
||||
<testsuite name="Package Test Suite">
|
||||
<directory suffix=".php">./tests/</directory>
|
||||
</testsuite>
|
||||
</testsuites>
|
||||
<filter>
|
||||
<whitelist>
|
||||
<directory suffix=".php">./</directory>
|
||||
<exclude>
|
||||
<directory suffix=".php">./vendor</directory>
|
||||
<directory suffix=".php">./tests</directory>
|
||||
</exclude>
|
||||
</whitelist>
|
||||
</filter>
|
||||
</phpunit>
|
||||
@@ -1,188 +1,112 @@
|
||||
<?php //ICB0 74:0 81:12ed 82:24de ?><?php //000ab
|
||||
// Copyright prestashow.com 2025. All Rights Reserved.
|
||||
// @authors prestashow.com <contact@prestashow.com>
|
||||
// @license https://prestashow.com/license
|
||||
return;
|
||||
?>
|
||||
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
|
||||
<?php namespace PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider;
|
||||
|
||||
use PShowSsoScoped\GuzzleHttp\Psr7\Uri;
|
||||
use PShowSsoScoped\League\OAuth2\Client\Provider\AbstractProvider;
|
||||
use PShowSsoScoped\League\OAuth2\Client\Provider\Exception\IdentityProviderException;
|
||||
use PShowSsoScoped\League\OAuth2\Client\Token\AccessToken;
|
||||
use PShowSsoScoped\Psr\Http\Message\ResponseInterface;
|
||||
|
||||
class Microsoft extends AbstractProvider
|
||||
{
|
||||
/**
|
||||
* Default scopes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $defaultScopes = ['wl.basic', 'wl.emails'];
|
||||
|
||||
/**
|
||||
* Base url for authorization.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $urlAuthorize = 'https://login.live.com/oauth20_authorize.srf';
|
||||
|
||||
/**
|
||||
* Base url for access token.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $urlAccessToken = 'https://login.live.com/oauth20_token.srf';
|
||||
|
||||
/**
|
||||
* Base url for resource owner.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $urlResourceOwnerDetails = 'https://apis.live.net/v5.0/me';
|
||||
|
||||
/**
|
||||
* Get authorization url to begin OAuth flow
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBaseAuthorizationUrl()
|
||||
{
|
||||
return $this->urlAuthorize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get access token url to retrieve token
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBaseAccessTokenUrl(array $params)
|
||||
{
|
||||
return $this->urlAccessToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get default scopes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDefaultScopes()
|
||||
{
|
||||
return $this->defaultScopes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check a provider response for errors.
|
||||
*
|
||||
* @throws IdentityProviderException
|
||||
* @param ResponseInterface $response
|
||||
* @return void
|
||||
*/
|
||||
protected function checkResponse(ResponseInterface $response, $data)
|
||||
{
|
||||
if (isset($data['error'])) {
|
||||
throw new IdentityProviderException(
|
||||
(isset($data['error']['message']) ? $data['error']['message'] : $response->getReasonPhrase()),
|
||||
$response->getStatusCode(),
|
||||
$response
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a user object from a successful user details request.
|
||||
*
|
||||
* @param array $response
|
||||
* @param AccessToken $token
|
||||
* @return MicrosoftResourceOwner
|
||||
*/
|
||||
protected function createResourceOwner(array $response, AccessToken $token)
|
||||
{
|
||||
return new MicrosoftResourceOwner($response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get provider url to fetch user details
|
||||
*
|
||||
* @param AccessToken $token
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getResourceOwnerDetailsUrl(AccessToken $token)
|
||||
{
|
||||
$uri = new Uri($this->urlResourceOwnerDetails);
|
||||
|
||||
return (string) Uri::withQueryValue($uri, 'access_token', (string) $token);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,152 +1,93 @@
|
||||
<?php //ICB0 74:0 81:efc 82:1d82 ?><?php //000ab
|
||||
// Copyright prestashow.com 2025. All Rights Reserved.
|
||||
// @authors prestashow.com <contact@prestashow.com>
|
||||
// @license https://prestashow.com/license
|
||||
return;
|
||||
?>
|
||||
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
|
||||
DyX3YuWA0ltSAfHPH2W9BDTLtOCkErBDiMcFuES==
|
||||
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
|
||||
zon1axxjmpYGiZF26uS==
|
||||
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
|
||||
78+10eKIpwUdFmsYJzRH6W==
|
||||
<?php namespace PShowSsoScoped\Stevenmaguire\OAuth2\Client\Provider;
|
||||
|
||||
use PShowSsoScoped\League\OAuth2\Client\Provider\ResourceOwnerInterface;
|
||||
|
||||
class MicrosoftResourceOwner implements ResourceOwnerInterface
|
||||
{
|
||||
/**
|
||||
* Raw response
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $response;
|
||||
|
||||
/**
|
||||
* Creates new resource owner.
|
||||
*
|
||||
* @param array $response
|
||||
*/
|
||||
public function __construct(array $response = array())
|
||||
{
|
||||
$this->response = $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user id
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getId()
|
||||
{
|
||||
return $this->response['id'] ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user email
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getEmail()
|
||||
{
|
||||
return $this->response['emails']['preferred'] ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user firstname
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getFirstname()
|
||||
{
|
||||
return $this->response['first_name'] ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user lastname
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getLastname()
|
||||
{
|
||||
return $this->response['last_name'] ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user name
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->response['name'] ?: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user urls
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getUrls()
|
||||
{
|
||||
return isset($this->response['link']) ? $this->response['link'].'/cid-'.$this->getId() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all of the owner details available as an array.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
return $this->response;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,174 @@
|
||||
<?php namespace Stevenmaguire\OAuth2\Client\Test\Provider;
|
||||
|
||||
use League\OAuth2\Client\Tool\QueryBuilderTrait;
|
||||
use Mockery as m;
|
||||
|
||||
class MicrosoftTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
use QueryBuilderTrait;
|
||||
|
||||
protected $provider;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->provider = new \Stevenmaguire\OAuth2\Client\Provider\Microsoft([
|
||||
'clientId' => 'mock_client_id',
|
||||
'clientSecret' => 'mock_secret',
|
||||
'redirectUri' => 'none',
|
||||
]);
|
||||
}
|
||||
|
||||
public function tearDown()
|
||||
{
|
||||
m::close();
|
||||
parent::tearDown();
|
||||
}
|
||||
|
||||
public function testAuthorizationUrl()
|
||||
{
|
||||
$url = $this->provider->getAuthorizationUrl();
|
||||
$uri = parse_url($url);
|
||||
parse_str($uri['query'], $query);
|
||||
|
||||
$this->assertArrayHasKey('client_id', $query);
|
||||
$this->assertArrayHasKey('redirect_uri', $query);
|
||||
$this->assertArrayHasKey('state', $query);
|
||||
$this->assertArrayHasKey('scope', $query);
|
||||
$this->assertArrayHasKey('response_type', $query);
|
||||
$this->assertArrayHasKey('approval_prompt', $query);
|
||||
$this->assertNotNull($this->provider->getState());
|
||||
}
|
||||
|
||||
public function testScopes()
|
||||
{
|
||||
$scopeSeparator = ',';
|
||||
$options = ['scope' => [uniqid(), uniqid()]];
|
||||
$query = ['scope' => implode($scopeSeparator, $options['scope'])];
|
||||
$url = $this->provider->getAuthorizationUrl($options);
|
||||
$encodedScope = $this->buildQueryString($query);
|
||||
$this->assertContains($encodedScope, $url);
|
||||
}
|
||||
|
||||
public function testGetAuthorizationUrl()
|
||||
{
|
||||
$url = $this->provider->getAuthorizationUrl();
|
||||
$uri = parse_url($url);
|
||||
|
||||
$this->assertEquals('/oauth20_authorize.srf', $uri['path']);
|
||||
}
|
||||
|
||||
public function testGetBaseAccessTokenUrl()
|
||||
{
|
||||
$params = [];
|
||||
|
||||
$url = $this->provider->getBaseAccessTokenUrl($params);
|
||||
$uri = parse_url($url);
|
||||
|
||||
$this->assertEquals('/oauth20_token.srf', $uri['path']);
|
||||
}
|
||||
|
||||
public function testSettingAuthEndpoints()
|
||||
{
|
||||
$customAuthUrl = uniqid();
|
||||
$customTokenUrl = uniqid();
|
||||
$customResourceOwnerUrl = uniqid();
|
||||
$token = m::mock('League\OAuth2\Client\Token\AccessToken');
|
||||
|
||||
$this->provider = new \Stevenmaguire\OAuth2\Client\Provider\Microsoft([
|
||||
'clientId' => 'mock_client_id',
|
||||
'clientSecret' => 'mock_secret',
|
||||
'redirectUri' => 'none',
|
||||
'urlAuthorize' => $customAuthUrl,
|
||||
'urlAccessToken' => $customTokenUrl,
|
||||
'urlResourceOwnerDetails' => $customResourceOwnerUrl
|
||||
]);
|
||||
|
||||
$authUrl = $this->provider->getAuthorizationUrl();
|
||||
$this->assertContains($customAuthUrl, $authUrl);
|
||||
$tokenUrl = $this->provider->getBaseAccessTokenUrl([]);
|
||||
$this->assertContains($customTokenUrl, $tokenUrl);
|
||||
$resourceOwnerUrl = $this->provider->getResourceOwnerDetailsUrl($token);
|
||||
$this->assertContains($customResourceOwnerUrl, $resourceOwnerUrl);
|
||||
|
||||
}
|
||||
|
||||
public function testGetAccessToken()
|
||||
{
|
||||
$response = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$response->shouldReceive('getBody')->andReturn('{"access_token":"mock_access_token","authentication_token":"","code":"","expires_in":3600,"refresh_token":"mock_refresh_token","scope":"","state":"","token_type":""}');
|
||||
$response->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
|
||||
|
||||
$client = m::mock('GuzzleHttp\ClientInterface');
|
||||
$client->shouldReceive('send')->times(1)->andReturn($response);
|
||||
$this->provider->setHttpClient($client);
|
||||
|
||||
$token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
|
||||
|
||||
$this->assertEquals('mock_access_token', $token->getToken());
|
||||
$this->assertLessThanOrEqual(time() + 3600, $token->getExpires());
|
||||
$this->assertGreaterThanOrEqual(time(), $token->getExpires());
|
||||
$this->assertEquals('mock_refresh_token', $token->getRefreshToken());
|
||||
$this->assertNull($token->getResourceOwnerId());
|
||||
}
|
||||
|
||||
public function testUserData()
|
||||
{
|
||||
$email = uniqid();
|
||||
$firstname = uniqid();
|
||||
$lastname = uniqid();
|
||||
$name = uniqid();
|
||||
$userId = rand(1000,9999);
|
||||
$urls = uniqid();
|
||||
|
||||
$postResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$postResponse->shouldReceive('getBody')->andReturn('{"access_token":"mock_access_token","authentication_token":"","code":"","expires_in":3600,"refresh_token":"mock_refresh_token","scope":"","state":"","token_type":""}');
|
||||
$postResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
|
||||
|
||||
$userResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$userResponse->shouldReceive('getBody')->andReturn('{"id": '.$userId.', "name": "'.$name.'", "first_name": "'.$firstname.'", "last_name": "'.$lastname.'", "emails": {"preferred": "'.$email.'"}, "link": "'.$urls.'"}');
|
||||
$userResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
|
||||
|
||||
$client = m::mock('GuzzleHttp\ClientInterface');
|
||||
$client->shouldReceive('send')
|
||||
->times(2)
|
||||
->andReturn($postResponse, $userResponse);
|
||||
$this->provider->setHttpClient($client);
|
||||
|
||||
$token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
|
||||
$user = $this->provider->getResourceOwner($token);
|
||||
|
||||
$this->assertEquals($email, $user->getEmail());
|
||||
$this->assertEquals($email, $user->toArray()['emails']['preferred']);
|
||||
$this->assertEquals($firstname, $user->getFirstname());
|
||||
$this->assertEquals($firstname, $user->toArray()['first_name']);
|
||||
$this->assertEquals($lastname, $user->getLastname());
|
||||
$this->assertEquals($lastname, $user->toArray()['last_name']);
|
||||
$this->assertEquals($name, $user->getName());
|
||||
$this->assertEquals($name, $user->toArray()['name']);
|
||||
$this->assertEquals($userId, $user->getId());
|
||||
$this->assertEquals($userId, $user->toArray()['id']);
|
||||
$this->assertEquals($urls.'/cid-'.$userId, $user->getUrls());
|
||||
$this->assertEquals($urls.'/cid-'.$userId, $user->toArray()['link'].'/cid-'.$user->toArray()['id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException League\OAuth2\Client\Provider\Exception\IdentityProviderException
|
||||
**/
|
||||
public function testExceptionThrownWhenErrorObjectReceived()
|
||||
{
|
||||
$message = uniqid();
|
||||
|
||||
$postResponse = m::mock('Psr\Http\Message\ResponseInterface');
|
||||
$postResponse->shouldReceive('getBody')->andReturn('{"error": {"code": "request_token_expired", "message": "'.$message.'"}}');
|
||||
$postResponse->shouldReceive('getHeader')->andReturn(['content-type' => 'json']);
|
||||
$postResponse->shouldReceive('getStatusCode')->andReturn(500);
|
||||
|
||||
$client = m::mock('GuzzleHttp\ClientInterface');
|
||||
$client->shouldReceive('send')
|
||||
->times(1)
|
||||
->andReturn($postResponse);
|
||||
$this->provider->setHttpClient($client);
|
||||
|
||||
$token = $this->provider->getAccessToken('authorization_code', ['code' => 'mock_authorization_code']);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user