/** * openid_auth_2 * Authenticate user with OpenID, step 2 */ private static function openid_auth_2() { $results = array(); $results['type'] = 'openid'; $consumer = Openid::get_consumer(); if ($consumer) { $response = $consumer->complete(Openid::get_return_url()); if ($response->status == Auth_OpenID_CANCEL) { $results['success'] = false; $results['error'] = 'OpenID verification cancelled.'; } else { if ($response->status == Auth_OpenID_FAILURE) { $results['success'] = false; $results['error'] = 'OpenID authentication failed: ' . $response->message; } else { if ($response->status == Auth_OpenID_SUCCESS) { // Extract the identity URL and Simple Registration data (if it was returned). $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response); $sreg = $sreg_resp->contents(); $results['website'] = $response->getDisplayIdentifier(); if (@$sreg['email']) { $results['email'] = $sreg['email']; } if (@$sreg['nickname']) { $results['username'] = $sreg['nickname']; } if (@$sreg['fullname']) { $results['name'] = $sreg['fullname']; } $users = User::get_from_website($results['website']); if (count($users) > 0) { if (count($users) == 1) { $user = new User($users[0]); $results['success'] = true; $results['username'] = $user->username; } else { // Several users for the same website/openid? Allowed but stupid, try to get a match on username. // Should we make website field unique? foreach ($users as $id) { $user = new User($id); if ($user->username == $results['username']) { $results['success'] = true; $results['username'] = $user->username; } } } } else { // Don't return success if an user already exists for this username but don't have this openid identity as website $user = User::get_from_username($results['username']); if ($user->id) { $results['success'] = false; $results['error'] = 'No user associated to this OpenID and username already taken.'; } else { $results['success'] = true; $results['error'] = 'No user associated to this OpenID.'; } } } } } } return $results; }