diff --git a/extensions/yii/authclient/AuthAction.php b/extensions/yii/authclient/AuthAction.php
index 65a6c7c..7584b0d 100644
--- a/extensions/yii/authclient/AuthAction.php
+++ b/extensions/yii/authclient/AuthAction.php
@@ -203,21 +203,9 @@ class AuthAction extends Action
switch ($_REQUEST['openid_mode']) {
case 'id_res':
if ($client->validate()) {
- $attributes = [
- 'id' => $client->getClaimedId()
- ];
- $rawAttributes = $client->fetchAttributes();
- foreach ($client->requiredAttributes as $openIdAttributeName) {
- if (isset($rawAttributes[$openIdAttributeName])) {
- $attributes[$openIdAttributeName] = $rawAttributes[$openIdAttributeName];
- } else {
- throw new Exception('Unable to complete the authentication because the required data was not received.');
- }
- }
- $client->setUserAttributes($attributes);
return $this->authSuccess($client);
} else {
- throw new Exception('Unable to complete the authentication because the required data was not received.');
+ throw new HttpException(400, 'Unable to complete the authentication because the required data was not received.');
}
break;
case 'cancel':
diff --git a/extensions/yii/authclient/OpenId.php b/extensions/yii/authclient/OpenId.php
index 8751e76..35527e9 100644
--- a/extensions/yii/authclient/OpenId.php
+++ b/extensions/yii/authclient/OpenId.php
@@ -382,13 +382,18 @@ class OpenId extends BaseClient implements ClientInterface
}
/**
- * Helper function used to scan for / tags and extract information
- * from them
- */
- protected function extractHtmlTagValue($content, $tag, $attrName, $attrValue, $valueName)
+ * Scans content for / tags and extract information from them.
+ * @param string $content HTML content to be be parsed.
+ * @param string $tag name of the source tag.
+ * @param string $matchAttributeName name of the source tag attribute, which should contain $matchAttributeValue
+ * @param string $matchAttributeValue required value of $matchAttributeName
+ * @param string $valueAttributeName name of the source tag attribute, which should contain searched value.
+ * @return string|boolean searched value, "false" on failure.
+ */
+ protected function extractHtmlTagValue($content, $tag, $matchAttributeName, $matchAttributeValue, $valueAttributeName)
{
- preg_match_all("#<{$tag}[^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*$valueName=['\"](.+?)['\"][^>]*/?>#i", $content, $matches1);
- preg_match_all("#<{$tag}[^>]*$valueName=['\"](.+?)['\"][^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*/?>#i", $content, $matches2);
+ preg_match_all("#<{$tag}[^>]*$matchAttributeName=['\"].*?$matchAttributeValue.*?['\"][^>]*$valueAttributeName=['\"](.+?)['\"][^>]*/?>#i", $content, $matches1);
+ preg_match_all("#<{$tag}[^>]*$valueAttributeName=['\"](.+?)['\"][^>]*$matchAttributeName=['\"].*?$matchAttributeValue.*?['\"][^>]*/?>#i", $content, $matches2);
$result = array_merge($matches1[1], $matches2[1]);
return empty($result) ? false : $result[0];
}
@@ -728,9 +733,10 @@ class OpenId extends BaseClient implements ClientInterface
/**
* Performs OpenID verification with the OP.
+ * @param boolean $validateRequiredAttributes whether to validate required attributes.
* @return boolean whether the verification was successful.
*/
- public function validate()
+ public function validate($validateRequiredAttributes = true)
{
$claimedId = $this->getClaimedId();
if (empty($claimedId)) {
@@ -769,7 +775,32 @@ class OpenId extends BaseClient implements ClientInterface
$response = $this->sendRequest($serverInfo['url'], 'POST', $params);
- return preg_match('/is_valid\s*:\s*true/i', $response);
+ if (preg_match('/is_valid\s*:\s*true/i', $response)) {
+ if ($validateRequiredAttributes) {
+ return $this->validateRequiredAttributes();
+ } else {
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Checks if all required attributes are present in the server response.
+ * @return boolean whether all required attributes are present.
+ */
+ protected function validateRequiredAttributes()
+ {
+ if (!empty($this->requiredAttributes)) {
+ $attributes = $this->fetchAttributes();
+ foreach ($this->requiredAttributes as $openIdAttributeName) {
+ if (!isset($attributes[$openIdAttributeName])) {
+ return false;
+ }
+ }
+ }
+ return true;
}
/**
@@ -856,4 +887,12 @@ class OpenId extends BaseClient implements ClientInterface
}
return $this->fetchSregAttributes();
}
+
+ /**
+ * @inheritdoc
+ */
+ protected function initUserAttributes()
+ {
+ return array_merge(['id' => $this->getClaimedId()], $this->fetchAttributes());
+ }
}
\ No newline at end of file