Integrasi Single Sign On OpenID pada Website berbasis PHP


OpenID adalah sebuah layanan identitas terpusat yang memungkinkan seseorang cukup mempunyai satu identitas untuk bisa mengakses berbagai macam website. Dengan mengintegrasikan aplikasi ini akan memudahkan user yang akan login pada website kita karena ia hanya perlu cukup mengingat satu account saja. Hingga saat ini OpenID sudah di dukung oleh website-webiste besar seperti Google, Yahoo, WordPress, VeriSign, AOL dll.

Pada OpenID terdapat dua tipe OpenID, yaitu OpenID sebagai identitiy provider dan OpenID sebagai client. OpenID sebagai identity provider adalah applikasi yang memberikan data user yang akan login kepada website yang menjadi OpenID client. Beberapa website yang sudah disebutkan di atas adalah website yang bertindak sebagai identity provider. Sedangkan contoh website yang menjadi OpenID client adalah Facebook, Sourceforge dll.

Dalam panduan berikut kita akan membuat website kita bertindak sebagai OpenID client side. Yang perlu diperhatikan adalah, OpenID menggunakan alamat url sebagai identitas user. Sebagai contoh Worpdress menggunakan http://nama_anda.wordpress.com/, Yahoo menggunakan http://me.yahoo.com/nama_anda dan Google menggunakan Blogspot sebagai OpenID url seperti http://nama_anda.blogspot.com.

Untuk mendapatkan library PHP OpenID Anda bisa mendownload di openid Libraries.

Dalam panduan ini penulis menggunakan library yang dibuat oleh JanRain openidenabled.com.

Pertama-tama kita akan membuat sebuah halaman index.php yang berisi form login untuk user. Di dalam halaman ini juga dilakukan proses otentifikasi data user. Berikut adalah source codenya:

<?php
require_once "common.php";
session_start();
$errors = null;

if( isset($_POST['submit']) ){

    $openid = $_POST['openid_identifier'];

    if(empty($openid))
        $errors[] = 'Your OpenID Empty.';

    if(!isset($errors)){
        $consumer = getConsumer();
        // Mulai proses otentivikasi OpenID.
        $auth_request = $consumer->begin($openid);
    }

    // Tampilkan error jika otentvikasi gagal.
    if (!$auth_request) {
        $errors[] = 'Authentication error; not a valid OpenID.';
    }

    if(!isset($errors)){
        //Inisial data user yang akan di minta ke OpenID server
        $sreg_request = Auth_OpenID_SRegRequest::build(
                                         // Required
                                         array('nickname'),
                                         // Optional
                                         array('fullname', 'email'));

        if ($sreg_request) {
            $auth_request->addExtension($sreg_request);
        }
    }

    // Redirect user ke OpenID server.
    if(!isset($errors)){
        if ($auth_request->shouldSendRedirect()) {
            $redirect_url = $auth_request->redirectURL(getTrustRoot(),
                                                       getReturnTo());

            // Tampilkan error jika redirect gagal.
            if (Auth_OpenID::isFailure($redirect_url)) {
                $errors[] = 'Could not redirect to server: ' . $redirect_url->message;
            } else {
                // Send redirect.
                header("Location: ".$redirect_url);
            }
        } else {
            // Untuk OpenID 2.0 Generate html.
            $form_id = 'openid_message';
            $form_html = $auth_request->htmlMarkup(getTrustRoot(), getReturnTo(),
                                                   false, array('id' => $form_id));

            //tampilkan errror jika gagal generate html
            if (Auth_OpenID::isFailure($form_html)) {
                $errors[] = 'Could not redirect to server: ' . $form_html->message;
            } else {
                print $form_html;
                exit;
            }
        }
    }
}

if( isset($_SESSION['openid']) )
    header('Location:home.php?');
?>
<html>
<head><title>PHP OpenID</title></head>

<body>
<?php
if( isset($errors) ){
    foreach( $errors as $error){
        echo $error.'<br />';
    }
}
?>
<form method="post" action="">
 OpenID URL:
<input type="hidden" name="action" value="verify" />
<input type="text" name="openid_identifier" value="" />
<input type="submit" name="submit" value="Login" />
</form>
</div>
</body>
</html>

Setelah user mengisikan OpenID url dan melakukan submit, maka data akan diproses oleh OpenID library dan dikirimkan ke OpenID provider menggunakan curl atau fopen. Jika data yang diisikan oleh user valid, maka OpenID provide akan memberikan data respon. Selanjutnya, user akan diridirect ke OpenID provider untuk memberikan konfirmasi ke user untuk memberikan persetujuan pertukaran data antara OpenID provider dan OpenID client.

Jika user memberikan persetujuan, OpenID server akan meredirect user kembali ke OpenID client. Pada OpenID client kembali terjadi pertukaran data antara OpenID provider dan OpenID client untuk mendapatkan data user yang diminta oleh OpenID client.

Berikut adalah code untuk halaman finish_auth.php yang menerima respon dari OpenID server setelah user memberikan persetujuan.

<?php
require_once "common.php";
session_start();

function escape($thing) {
    return htmlentities($thing);
}

function run() {
    $consumer = getConsumer();

    // Complete the authentication process using the server's
    // response.
    $return_to = getReturnTo();
    $response = $consumer->complete($return_to);

    // Check the response status.
    if ($response->status == Auth_OpenID_CANCEL) {
        // This means the authentication was cancelled.
        exit('Verification cancelled.');
    }
    else if ($response->status == Auth_OpenID_FAILURE) {
        // Authentication failed; display the error message.
        exit('OpenID authentication failed: ' . $response->message);
    }
    else if ($response->status == Auth_OpenID_SUCCESS) {
        // This means the authentication succeeded; extract the
        // identity URL and Simple Registration data (if it was
        // returned).
        $openid = $response->getDisplayIdentifier();
        $esc_identity = escape($openid);

        $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
        $sreg = $sreg_resp->contents();
        do_login($esc_identity, $sreg);
    }
}

function do_login($openid, $sreg = null){
    session_start();
    $_SESSION['openid'] = $openid;
    header('Location:home.php?');
}

run();

?>

Kini user sudah berada pada halaman home.php yang itu berarti user sudah memiliki otoritas. Berikut adalah code dari file home.php:

<?php
session_start();
if(empty($_SESSION) || !isset($_SESSION) )
    header('Location:index.php');

if(isset($_GET['logout'])){
    session_destroy();
    header('Location:index.php');
}
else{
    $openid = $_SESSION['openid'];
?>
<html>
<head><title>Welcome <?php echo $openid;?></title></head>
<body>
    Selamat datang <?php echo $openid;?> <a href="?logout">Logout</a>
</body>
</html>
<?php
}
?>

Selain tiga file ini, kita juga membuthkan file common.php dan semua isi folder Auth yang bisa didapatkan dari JanRain PHP library.

Kini website Anda sudah terintegrasi dengan OpenID

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s