/vendor/yiisoft/yii2-authclient/OAuth2.php
https://gitlab.com/itlboy/yii2-starter-installed · PHP · 272 lines · 140 code · 36 blank · 96 comment · 10 complexity · 57c0042ead0b78863f9e2782f64141ea MD5 · raw file
- <?php
- /**
- * @link http://www.yiiframework.com/
- * @copyright Copyright (c) 2008 Yii Software LLC
- * @license http://www.yiiframework.com/license/
- */
- namespace yii\authclient;
- use Yii;
- use yii\web\HttpException;
- /**
- * OAuth2 serves as a client for the OAuth 2 flow.
- *
- * In oder to acquire access token perform following sequence:
- *
- * ```php
- * use yii\authclient\OAuth2;
- *
- * $oauthClient = new OAuth2();
- * $url = $oauthClient->buildAuthUrl(); // Build authorization URL
- * Yii::$app->getResponse()->redirect($url); // Redirect to authorization URL.
- * // After user returns at our site:
- * $code = $_GET['code'];
- * $accessToken = $oauthClient->fetchAccessToken($code); // Get access token
- * ```
- *
- * @see http://oauth.net/2/
- * @see https://tools.ietf.org/html/rfc6749
- *
- * @author Paul Klimov <klimov.paul@gmail.com>
- * @since 2.0
- */
- abstract class OAuth2 extends BaseOAuth
- {
- /**
- * @var string protocol version.
- */
- public $version = '2.0';
- /**
- * @var string OAuth client ID.
- */
- public $clientId;
- /**
- * @var string OAuth client secret.
- */
- public $clientSecret;
- /**
- * @var string token request URL endpoint.
- */
- public $tokenUrl;
- /**
- * @var boolean whether to use and validate auth 'state' parameter in authentication flow.
- * If enabled - the opaque value will be generated and applied to auth URL to maintain
- * state between the request and callback. The authorization server includes this value,
- * when redirecting the user-agent back to the client.
- * The option is used for preventing cross-site request forgery.
- * @since 2.1
- */
- public $validateAuthState = true;
- /**
- * Composes user authorization URL.
- * @param array $params additional auth GET params.
- * @return string authorization URL.
- */
- public function buildAuthUrl(array $params = [])
- {
- $defaultParams = [
- 'client_id' => $this->clientId,
- 'response_type' => 'code',
- 'redirect_uri' => $this->getReturnUrl(),
- 'xoauth_displayname' => Yii::$app->name,
- ];
- if (!empty($this->scope)) {
- $defaultParams['scope'] = $this->scope;
- }
- if ($this->validateAuthState) {
- $authState = $this->generateAuthState();
- $this->setState('authState', $authState);
- $defaultParams['state'] = $authState;
- }
- return $this->composeUrl($this->authUrl, array_merge($defaultParams, $params));
- }
- /**
- * Fetches access token from authorization code.
- * @param string $authCode authorization code, usually comes at $_GET['code'].
- * @param array $params additional request params.
- * @return OAuthToken access token.
- * @throws HttpException on invalid auth state in case [[enableStateValidation]] is enabled.
- */
- public function fetchAccessToken($authCode, array $params = [])
- {
- if ($this->validateAuthState) {
- $authState = $this->getState('authState');
- if (!isset($_REQUEST['state']) || empty($authState) || strcmp($_REQUEST['state'], $authState) !== 0) {
- throw new HttpException(400, 'Invalid auth state parameter.');
- } else {
- $this->removeState('authState');
- }
- }
- $defaultParams = [
- 'client_id' => $this->clientId,
- 'client_secret' => $this->clientSecret,
- 'code' => $authCode,
- 'grant_type' => 'authorization_code',
- 'redirect_uri' => $this->getReturnUrl(),
- ];
- $request = $this->createRequest()
- ->setMethod('POST')
- ->setUrl($this->tokenUrl)
- ->setData(array_merge($defaultParams, $params));
- $response = $this->sendRequest($request);
- $token = $this->createToken(['params' => $response]);
- $this->setAccessToken($token);
- return $token;
- }
- /**
- * @inheritdoc
- */
- public function applyAccessTokenToRequest($request, $accessToken)
- {
- $data = $request->getData();
- $data['access_token'] = $accessToken->getToken();
- $request->setData($data);
- }
- /**
- * Gets new auth token to replace expired one.
- * @param OAuthToken $token expired auth token.
- * @return OAuthToken new auth token.
- */
- public function refreshAccessToken(OAuthToken $token)
- {
- $params = [
- 'client_id' => $this->clientId,
- 'client_secret' => $this->clientSecret,
- 'grant_type' => 'refresh_token'
- ];
- $params = array_merge($token->getParams(), $params);
- $request = $this->createRequest()
- ->setMethod('POST')
- ->setUrl($this->tokenUrl)
- ->setData($params);
- $response = $this->sendRequest($request);
- $token = $this->createToken(['params' => $response]);
- $this->setAccessToken($token);
- return $token;
- }
- /**
- * Composes default [[returnUrl]] value.
- * @return string return URL.
- */
- protected function defaultReturnUrl()
- {
- $params = $_GET;
- unset($params['code']);
- unset($params['state']);
- $params[0] = Yii::$app->controller->getRoute();
- return Yii::$app->getUrlManager()->createAbsoluteUrl($params);
- }
- /**
- * Generates the auth state value.
- * @return string auth state value.
- * @since 2.1
- */
- protected function generateAuthState()
- {
- $baseString = get_class($this) . '-' . time();
- if (Yii::$app->has('session')) {
- $baseString .= '-' . Yii::$app->session->getId();
- }
- return hash('sha256', uniqid($baseString, true));
- }
- /**
- * Creates token from its configuration.
- * @param array $tokenConfig token configuration.
- * @return OAuthToken token instance.
- */
- protected function createToken(array $tokenConfig = [])
- {
- $tokenConfig['tokenParamKey'] = 'access_token';
- return parent::createToken($tokenConfig);
- }
- /**
- * Authenticate OAuth client directly at the provider without third party (user) involved,
- * using 'client_credentials' grant type.
- * @see http://tools.ietf.org/html/rfc6749#section-4.4
- * @param array $params additional request params.
- * @return OAuthToken access token.
- */
- public function authenticateClient($params = [])
- {
- $defaultParams = [
- 'client_id' => $this->clientId,
- 'client_secret' => $this->clientSecret,
- 'grant_type' => 'client_credentials',
- ];
- if (!empty($this->scope)) {
- $defaultParams['scope'] = $this->scope;
- }
- $request = $this->createRequest()
- ->setMethod('POST')
- ->setUrl($this->tokenUrl)
- ->setData(array_merge($defaultParams, $params));
- $response = $this->sendRequest($request);
- $token = $this->createToken(['params' => $response]);
- $this->setAccessToken($token);
- return $token;
- }
- /**
- * Authenticates user directly by 'username/password' pair, using 'password' grant type.
- * @see https://tools.ietf.org/html/rfc6749#section-4.3
- * @param string $username user name.
- * @param string $password user password.
- * @param array $params additional request params.
- * @return OAuthToken access token.
- */
- public function authenticateUser($username, $password, $params = [])
- {
- $defaultParams = [
- 'client_id' => $this->clientId,
- 'client_secret' => $this->clientSecret,
- 'grant_type' => 'password',
- 'username' => $username,
- 'password' => $password,
- ];
- if (!empty($this->scope)) {
- $defaultParams['scope'] = $this->scope;
- }
- $request = $this->createRequest()
- ->setMethod('POST')
- ->setUrl($this->tokenUrl)
- ->setData(array_merge($defaultParams, $params));
- $response = $this->sendRequest($request);
- $token = $this->createToken(['params' => $response]);
- $this->setAccessToken($token);
- return $token;
- }
- }