SSO (Single Sign On) OAUTH2 ADFS 3.0 dengan PHP

 Author : Nugroho R. Hadi .W, 07 April, 2018, Komentar



Kali ini saya akan sedikit berbagi pengalaman saya, tentang Authorization ADFS dengan protocol OAUTH2 dengan bahasa pemprograman PHP. Ini mungkin akan jadi pokok bahasan yang tidak umum bagi Anda jika sebelumnya Anda tidak memiliki pengalaman tentang Active Directory dan  Active Directory Federation. Saya tidak akan membahas tentang dua hal tersebut, karna kali ini saya hanya fokus bagai mana cara implementasi atau pemanfaatan dua hal yang saya sebutkan tadi untuk mengintegrasikan sebuah aplikasi SSO dengan PHP. Bagi anda yang sudah pernah implementasi SSO PHP ADFS,  tentunya tidak asing dengan framework simplesamlphpTapi disini  kita tidak akan menggunakan  simplesamlphp untuk PHP SSO



Ada banyak alasan kenapa saya tidak lagi menggunakan simplesamlphp, mulai dari configurasi yang ribet, banyak yang harus di Custom dan meng-Customnya pun tidaklah mudah. Jadi ini mungkin akan membuka wawasan anda lebih dalam dan mulai menggunakan metode yang dibawah ini.


Konfigurasi ActiveDirectory & ADFS

Tahap pertama yang harus Anda pastikan adalah, di enviroment Anda telah tersedia terkait dua Hal diatas AD dan ADFS, anda bisa mengunakan enviroment local/ On Premise Anda atau dengan Window Azure. Berikut ini cara bagaimana meng-Registrasikan aplikasi Anda untuk di SSO-kan, gunakan Powershell untuk mengeksekusi potongan skrip berikut:


Add-ADFSClient -Name "PHP-SSO" -ClientId "xxx-xxx-xxx" -RedirectUri="http://phpsso.io:81/getAToken"

Skrip diatas diartikan sebagai berikut:

  • Anda mengregistrasikan Aplikasi SSO dengan nama PHP-SSO
  • ClientId yang didaftrakan adalah xxx-xxx-xxx
  • Kembalian URL setelah login adalah http://phpsso.io:81/getAToken


Authorization Code Flow




Diagram di atas, saya diambil dari OAUTH2 RFC, yang mewakili Authorization Code Flow dan merupakan satu-satunya aliran yang diimplementasikan oleh ADFS 3.0. Ini adalah pertukaran informasi yang terjadi untuk memberikan akses kepada pengguna. Sangat mudah dimengerti. 


ADFS 3.0 Authorization Code Flow

Autorisasi dengan ADFS 3.0 sangatlah sederhana, saya mengutip dari sumber Git Hub, tentang konsep code flow autorisasi dengan ADFS.

Authorization Request

GET /adfs/oauth2/authorize?response_type=code&client_id=xxx-xxx-xxx&resource=urn-relying-party-trust-identifier&redirect_uri=http://phpsso.io:81/getAToken HTTP/1.1
Host: your.adfs.server
Aplikasi meminta server ADFS (melalui user-agent) untuk kode otorisasi dengan parameter client_id dan redirect_uri yang telah kita daftarkan sebelumnya dan pengidentifikasi sumber daya yang terkait dengan Relying Party Trust

Authorization Grant

Setelah Anda berhasil untuk login anda akan diarahkan ke alamat redirect_uri yang sebelumnya kita define saat mendaftarkan aplikasi dan code akan di kirimkan ke halaman kembalian.

HTTP 302 Found
Location: http://localhost:3000/getAToken?code=<the code>

Access Token

Setelah berhasil mendapatkan code, langkah selanjutnya adalah mendapatkan aksess token.


POST /adfs/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: your.adfs.server
Content-Length: <some number>
grant_type=authorization_code&client_id=xxx-xxx-xxx&redirect_uri=http://phpsso.io:81/getAToken&code=thecode


Nilai kembalian nya akan berupa Json Web Token (JWT) seperti berikut:

PHP-CODE

function getToken($code, $url, $clientId, $source, $redirect)
{
$fields_string="";
$fields = array(
'grant_type' => urlencode("authorization_code"),
'client_id' => urlencode($clientId),
'redirect_uri' => urlencode($redirect),
'code' => urlencode($code) 
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
 
$response = curl_exec($ch);
// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size); 
//close connection
curl_close($ch);
return $body;
}
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
{
    "access_token":"<access_token>",
    "token_type":"bearer",
    "expires_in":3600
}

Membaca Data Pengguna dengan PHP

Setelah Anda berhasil mendapatkan access_token, saat nya membaca properti pengguna yang melakukan login dan properti-properti apa saja yang melekat pada user tersebut.
function readToken($jwt_access_token){ 
$separator = '.'; 
if (2 !== substr_count($jwt_access_token, $separator)) {
throw new Exception("Incorrect access token format");

list($header, $payload, $signature) = explode($separator, $jwt_access_token); 
$decoded_signature = base64_decode(str_replace(array('-', '_'), array('+', '/'), $signature)); 
// The header and payload are signed together
$payload_to_verify = utf8_decode($header . $separator . $payload);  
// output the JWT Access Token payload
return base64_decode($payload);
}

Memperoleh token pembaruan dari ADFS 3.0

refresh-token tersedia pada pengimplementasian ADFS, tetapi Anda perlu melakukan beberapa hal agar itu berjalan. Jalankan script berikut pada prompt Administrasi PowerShell -
Set-AdfsRelyingPartyTrust -TargetName "RPT Name" -IssueOAuthRefreshTokensUntuk Semua Perangkat
Set-AdfsRelyingPartyTrust -TargetName "RPT Name" -TokenLifetime 10
Set-AdfsProperties -SSOLifetime 480
Ini akan membuat akses Token berjalan selama 10 menit dan menyegarkan token untuk semua klien selama 8 jam.

Semoga ini bermanfaat, dan kirimkan saran serta masukan Anda tentang ini pada kolom komentar.
 
Bagikan halaman ke sosial media
 
Tags :   SSO (Single Sign On)     OAUTH2     ADFS 3.0    PHP       

Tentang Penulis

writer Nugroho R. Hadi .W
Lead Sofware Developer di PT. Yafii Solusi Internasional

Link: http://www.hadinug.net/

   Komentar Anda