$self_url . "?action=verify",
'process' => $self_url . "?action=process");
if (!array_key_exists($action, $urls)) {
// Default behavior.
$action = 'default_page';
}
/**
* Run the approriatley-named function based on the scrubbed value of
* $action.
*/
$action();
/**
* Escapes double quotes in a value and returns the value wrapped in
* double quotes for use as an HTML attribute.
*/
function quoteattr($s)
{
$s = str_replace('"', '"', $s);
return sprintf('"%s"', $s);
}
/**
* Prints the page header with a specified title.
*/
function print_header($title)
{
$header_str = "
%s
%s
This example consumer uses the PHP
OpenID library. It just verifies that the URL that you enter
is your identity URL.
";
print sprintf($header_str, $title, $title);
}
/**
* Prints the page footer, which also includes the OpenID auth form.
*/
function print_footer()
{
global $urls;
$footer_str = "
";
print sprintf($footer_str, quoteattr($urls['verify']));
}
/**
* Render a default page.
*/
function default_page()
{
render();
}
/**
* Use some parameters to render a page with the specified title,
* including an optional message and CSS class to format the message
* in case the caller wants to display a notification or error.
*/
function render($message = null, $css_class = null,
$title = "PHP OpenID Consumer Example")
{
print_header($title);
if ($message) {
if (!$css_class) {
$css_class = 'alert';
}
print "$message
";
}
print_footer();
}
/**
* Process the OpenID auth form submission by starting the OpenID auth
* process.
*/
function verify()
{
global $consumer, $urls, $self_url,
$Auth_OpenID_HTTP_FAILURE,
$Auth_OpenID_PARSE_ERROR,
$Auth_OpenID_SUCCESS;
// Render a default page if we got a submission without an
// openid_url value.
if (!array_key_exists('openid_url', $_GET) ||
!$_GET['openid_url']) {
default_page();
return;
}
$openid_url = $_GET['openid_url'];
// Begin the OpenID authentication process.
list($status, $info) = $consumer->beginAuth($openid_url);
// Handle failure status return values.
if (in_array($status, array($Auth_OpenID_HTTP_FAILURE, $Auth_OpenID_PARSE_ERROR))) {
if ($status == $Auth_OpenID_HTTP_FAILURE) {
render("HTTP failure");
} else {
render("HTTP Parse error");
}
} else if ($status == $Auth_OpenID_SUCCESS) {
// If we got a successful return, continue the auth by
// redirecting the user agent to the OpenID server. Be sure
// to give the server a URL that will cause this script's
// "process" function to process the server's response.
$_SESSION['openid_token'] = $info->token;
$return_to = "http://".$_SERVER['HTTP_HOST'].$urls['process'];
$redirect_url = @$consumer->constructRedirect($info, $return_to,
"http://" . $_SERVER['HTTP_HOST']);
header("Location: ".$redirect_url);
} else {
render("Got unexpected status: '$status'");
}
}
/**
* Process the response from an OpenID server.
*/
function process()
{
global $consumer,
$Auth_OpenID_SUCCESS,
$Auth_OpenID_FAILURE;
// Retrieve the token from the session.
$token = $_SESSION['openid_token'];
// Ask the library to check the response that the server sent us.
// Status is a code indicating the response type. info is either
// None or a string containing more information about the return
// type.
// Because PHP mangles CGI names by replacing dots with
// underscores, try to fix the reponse by replacing underscores
// with dots so we can look for openid.* values.
$data = Auth_OpenID_Consumer::fixResponse($_GET);
// Complete the authentication process using the server's
// response.
list($status, $info) = $consumer->completeAuth($token, $data);
$css_class = 'error';
$openid_url = null;
// React to the server's response status.
if (($status == $Auth_OpenID_FAILURE) &&
$info) {
// In the case of failure, if info is non-None, it is the URL
// that we were verifying. We include it in the error message
// to help the user figure out what happened.
$openid_url = $info;
$fmt = "Verification of %s failed.";
$message = sprintf($fmt, $openid_url);
} else if ($status == $Auth_OpenID_SUCCESS) {
// Success means that the transaction completed without
// error. If info is None, it means that the user cancelled
// the verification.
$css_class = 'alert';
if ($info) {
// This is a successful verification attempt. If this was
// a real application, we would do our login, comment
// posting, etc. here.
$openid_url = $info;
$fmt = "You have successfully verified %s as your identity.";
$message = sprintf($fmt, $openid_url);
} else {
// cancelled
$message = 'Verification cancelled';
}
} else {
// Either we don't understand the code or there is no
// openid_url included with the error. Give a generic failure
// message. The library should supply debug information in a
// log.
$message = 'Verification failed.';
}
render($message, $css_class);
}
?>