-
Notifications
You must be signed in to change notification settings - Fork 114
/
EOpenIDService.php
148 lines (128 loc) · 4.04 KB
/
EOpenIDService.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?php
/**
* EOpenIDService class file.
*
* @author Maxim Zemskov <[email protected]>
* @link http://github.com/Nodge/yii-eauth/
* @license http://www.opensource.org/licenses/bsd-license.php
*/
require_once 'EAuthServiceBase.php';
/**
* EOpenIDService is a base class for all OpenID providers.
*
* @package application.extensions.eauth
*/
abstract class EOpenIDService extends EAuthServiceBase implements IAuthService {
/**
* @var string a pattern that represents the part of URL-space for which an OpenID Authentication request is valid.
* See the spec for more info: http://openid.net/specs/openid-authentication-2_0.html#realms
* Note: a pattern can be without http(s):// part
*/
public $realm;
/**
* @var LightOpenID the openid library instance.
*/
private $auth;
/**
* @var string the OpenID authorization url.
*/
protected $url;
/**
* @var array the OpenID required attributes.
*/
protected $requiredAttributes = array();
/**
* @var array the OpenID optional attributes.
*/
protected $optionalAttributes = array();
/**
* Initialize the component.
*
* @param EAuth $component the component instance.
* @param array $options properties initialization.
*/
public function init($component, $options = array()) {
parent::init($component, $options);
$this->auth = Yii::app()->loid->load();
}
/**
* Authenticate the user.
*
* @return boolean whether user was successfuly authenticated.
* @throws EAuthException
* @throws CHttpException
*/
public function authenticate() {
if (!empty($_REQUEST['openid_mode'])) {
switch ($_REQUEST['openid_mode']) {
case 'id_res':
try {
$this->auth->returnUrl = $this->getState('returnUrl');
if ($this->auth->validate()) {
$this->attributes['id'] = $this->auth->identity;
$attributes = $this->auth->getAttributes();
foreach ($this->requiredAttributes as $key => $attr) {
if (isset($attributes[$attr[1]])) {
$this->attributes[$key] = $attributes[$attr[1]];
}
else {
throw new EAuthException(Yii::t('eauth', 'Unable to complete the authentication because the required data was not received.', array('{provider}' => $this->getServiceTitle())));
return false;
}
}
foreach ($this->optionalAttributes as $key => $attr) {
if (isset($attributes[$attr[1]])) {
$this->attributes[$key] = $attributes[$attr[1]];
}
}
$this->authenticated = true;
return true;
}
else {
throw new EAuthException(Yii::t('eauth', 'Unable to complete the authentication because the required data was not received.', array('{provider}' => $this->getServiceTitle())));
return false;
}
} catch (Exception $e) {
throw new EAuthException($e->getMessage(), $e->getCode());
}
break;
case 'cancel':
$this->cancel();
break;
default:
throw new CHttpException(400, Yii::t('yii', 'Your request is invalid.'));
break;
}
}
else {
$this->auth->identity = $this->url; //Setting identifier
$this->auth->required = array(); //Try to get info from openid provider
foreach ($this->requiredAttributes as $attribute) {
$this->auth->required[$attribute[0]] = $attribute[1];
}
foreach ($this->optionalAttributes as $attribute) {
$this->auth->required[$attribute[0]] = $attribute[1];
}
if (isset($this->realm)) {
if (!preg_match('#^[a-z]+\://#', $this->realm)) {
$this->auth->realm = 'http' . (Yii::app()->request->getIsSecureConnection() ? 's' : '') . '://' . $this->realm;
}
else {
$this->auth->realm = $this->realm;
}
}
else {
$this->auth->realm = Yii::app()->request->hostInfo;
}
$this->auth->returnUrl = Yii::app()->request->hostInfo . Yii::app()->request->url; //getting return URL
$this->setState('returnUrl', $this->auth->returnUrl);
try {
$url = $this->auth->authUrl();
Yii::app()->request->redirect($url);
} catch (Exception $e) {
throw new EAuthException($e->getMessage(), $e->getCode());
}
}
return false;
}
}