Otentikasi dan otorisasi menggunakan Auth0 di PHP
() translation by (you can also view the original English article)
Dalam artikel ini, kita akan menjelajahi layanan Auth0, yang menyediakan otentikasi dan otorisasi sebagai layanan. Auth0 memungkinkan Anda untuk mengatur otentikasi dasar dan fitur otorisasi untuk aplikasi Anda dalam waktu singkat.
Apakah Auth0?
Auth0 adalah otentikasi sebagai fasilitas layanan yang membuat implementasi fitur terkait otentikasi pada website Anda menjadi mudah. Jika Anda telah membangun aplikasi dan Anda hanya ingin meng-outsource fitur otentikasi dan otorisasi, layanan seperti Auth0 adalah sesuatu yang harus Anda pertimbangkan.
Biarkan saya meringkas dengan singkat apa yang Auth0 tawarkan:
- SSO (Single Sign-On)
- Otentikasi Multifaktor
- Login tanpa kata sandi
- Manajemen pengguna
- dan banyak lagi
Dalam artikel ini, kita akan membahas beberapa metode single sign-on yang dapat Anda terapkan pada aplikasi website Anda untuk memanfaatkan fitur otentikasi yang disediakan oleh layanan Auth0.
Di bagian pertama artikel, kita akan menjelajahi cara menyiapkan fungsi otentikasi dasar di aplikasi web PHP pada sisi server. Di bagian kedua, Saya akan menjelaskan cara Anda dapat mengamankan API khusus Anda dengan menyiapkan OAuth otorisasi menggunakan layanan Auth0.
Integrasi Otentikasi Server-Side
Di bagian ini, kita akan membahas bagaimana Anda dapat dengan cepat mengatur otentikasi dasar untuk aplikasi web sisi server menggunakan Auth0. Sebenarnya, tim Auth0 sudah menyediakan contoh GitHub berguna yang menunjukkan contoh-contoh dasar, jadi kami akan menggunakannya daripada kita membuatnya kembali.
Sebelum melanjutkan, pastikan untuk menginstal Composer karena itu akan digunakan untuk menginstal Auth0 SDK yang menggunakan composer.json
file. Juga, jika Anda ingin mengikuti contoh pada artikel ini, lanjutkan dan dapatkan akun gratis dengan Auth0.
Mengatur Proyek
Mari kita lanjutkan dan ambil tiruan dari proyek sampel.
1 |
git clone https://github.com/auth0-samples/auth0-php-web-app.git . |
Silakan jalankan composer install
perintah untuk menginstal dependensi.
1 |
cd 00-Starter-Seed
|
2 |
composer install
|
Menurut file composer.json, seharusnya sudah menginstal package vlucas/phpdotenv
dan auth0/auth0-php
.
1 |
{
|
2 |
"name": "auth0/basic-webapp-sample", |
3 |
"description": "Basic sample for securing a WebApp with Auth0", |
4 |
"require": { |
5 |
"vlucas/phpdotenv": "2.4.0", |
6 |
"auth0/auth0-php": "~5.0" |
7 |
},
|
8 |
"license": "MIT", |
9 |
"authors": [ |
10 |
{
|
11 |
"name": "Martin Gontovnikas", |
12 |
"email": "martin@gon.to" |
13 |
},
|
14 |
{
|
15 |
"name": "Germán Lena", |
16 |
"email": "german.lena@gmail.com" |
17 |
}
|
18 |
]
|
19 |
}
|
Library vlucas/phpdotenv
digunakan untuk menginisialisasi variabel environtment dari file .env. Dengan demikian, ini memungkinkan Anda untuk memisahkan konfigurasi dari perubahan kode di antara environtment.
Di sisi lain, package auth0/auth0-php
adalah package yang akan membantu kami mengatur otorisasi dalam aplikasi kami.
Selanjutnya, mari kita mengatur konfigurasi untuk aplikasi kita pada file .env. Lanjutkan dan buat file .env dengan menyalinnya dari file .env.example.
1 |
cp .env.example .env
|
Ini berisi nilai konfigurasi yang akan digunakan oleh library Auth0.
1 |
AUTH0_CLIENT_ID={CLIENT_ID} |
2 |
AUTH0_DOMAIN={DOMAIN_NAME} |
3 |
AUTH0_CLIENT_SECRET={CLIENT_SECRET} |
4 |
AUTH0_CALLBACK_URL={CALLBACK_URL} |
5 |
AUTH0_AUDIENCE= |
Anda harus dapat menemukan sebagian besar pengaturan di bawah Applications > Default App > Settings pada dasboard Auth0. Harap dicatat bahwa saya menggunakan aplikasi default yang dibuat oleh sistem. Tentu saja, Anda dapat melanjutkan dan membuat aplikasi baru jika Anda ingin melakukannya.
AUTH0_CALLBACK_URL
adalah URL aplikasi Anda di mana Auth0 akan mengalihkan pengguna setelah melakukan proses login dan logout. Nilai yang Anda tetapkan dalam bidang ini harus dikonfigurasi di Allowed Callback URLs
dalam pengaturan aplikasi pada dasboard Auth0.
Anda akan menemukan tiga file utama yang mengimplementasikan sebagian besar logika autentikasi.
- index.php : Ini adalah halaman utama yang menampilkan tombol login atau logout berdasarkan keadaan pengguna.
- login.php : Script ini akan dimulai ketika Anda melakukan proses klik pada tombol login, dan ini akan mengarahkan pengguna ke antarmuka login Auth0 untuk melakukan proses login. Setelah masuk, mereka akan diarahkan kembali ke
AUTH0_CALLBACK_URL
. - logout.php : Script ini akan dimulai ketika Anda melakukan proses klik pada tombol logout, dan ini akan mengarahkan pengguna ke Auth0 melalui background, keluar, dan mengembalikannya ke
AUTH0_CALLBACK_URL
.
File Proyek Utama
Mari kita lewati setiap file dalam proyek awal dengan cepat.
Login Script
Kami akan mulai dengan file login.php.
1 |
<?php
|
2 |
require __DIR__ . '/vendor/autoload.php'; |
3 |
require __DIR__ . '/dotenv-loader.php'; |
4 |
|
5 |
use Auth0\SDK\Auth0; |
6 |
|
7 |
$domain = getenv('AUTH0_DOMAIN'); |
8 |
$client_id = getenv('AUTH0_CLIENT_ID'); |
9 |
$client_secret = getenv('AUTH0_CLIENT_SECRET'); |
10 |
$redirect_uri = getenv('AUTH0_CALLBACK_URL'); |
11 |
$audience = getenv('AUTH0_AUDIENCE'); |
12 |
|
13 |
if($audience == ''){ |
14 |
$audience = 'https://' . $domain . '/userinfo'; |
15 |
}
|
16 |
|
17 |
$auth0 = new Auth0([ |
18 |
'domain' => $domain, |
19 |
'client_id' => $client_id, |
20 |
'client_secret' => $client_secret, |
21 |
'redirect_uri' => $redirect_uri, |
22 |
'audience' => $audience, |
23 |
'scope' => 'openid profile', |
24 |
'persist_id_token' => true, |
25 |
'persist_access_token' => true, |
26 |
'persist_refresh_token' => true, |
27 |
]);
|
28 |
|
29 |
$auth0->login(); |
Di awal, kami telah menyertakan autoloader yang bertanggung jawab untuk memuat Auth0 dan environment variabel dari kelas terkait. Setelah itu, kami menginisialisasi variabel konfigurasi dari file .env menggunakan fungsi getenv
.
Selanjutnya, kita akan melakukan proses instantiate objek Auth0 dan memanggil method login yang mengarahkan pengguna ke Auth0 untuk melakukan proses login. Setelah login, pengguna akan diarahkan kembali ke website kami.
Anda dapat melakukan proses login menggunakan akun sosial media seperti Facebook, Google dan sejenisnya, atau membuat akun baru saat masuk. Dalam kedua kasus tersebut, Auth0 akan membuat data untuk pengguna baru di akhir proses. Anda dapat mengaktifkan berbagai macam cara login melalui sosial media di dalam Connections > Social pada dashboard Auth0. Selain itu, Anda dapat memeriksa daftar pengguna yang masuk menggunakan Auth0 melalui dasboard Auth0 di bawah tautan Pengguna (Users).
Logout Script
Selanjutnya, mari dengan cepat kita lihat file logout.php.
1 |
<?php
|
2 |
require __DIR__ . '/vendor/autoload.php'; |
3 |
require __DIR__ . '/dotenv-loader.php'; |
4 |
use Auth0\SDK\Auth0; |
5 |
|
6 |
$domain = getenv('AUTH0_DOMAIN'); |
7 |
$client_id = getenv('AUTH0_CLIENT_ID'); |
8 |
$client_secret = getenv('AUTH0_CLIENT_SECRET'); |
9 |
$redirect_uri = getenv('AUTH0_CALLBACK_URL'); |
10 |
$audience = getenv('AUTH0_AUDIENCE'); |
11 |
|
12 |
if($audience == ''){ |
13 |
$audience = 'https://' . $domain . '/userinfo'; |
14 |
}
|
15 |
|
16 |
$auth0 = new Auth0([ |
17 |
'domain' => $domain, |
18 |
'client_id' => $client_id, |
19 |
'client_secret' => $client_secret, |
20 |
'redirect_uri' => $redirect_uri, |
21 |
'audience' => $audience, |
22 |
'scope' => 'openid profile', |
23 |
'persist_id_token' => true, |
24 |
'persist_refresh_token' => true, |
25 |
]);
|
26 |
|
27 |
$auth0->logout(); |
28 |
$return_to = 'https://' . $_SERVER['HTTP_HOST']; |
29 |
$logout_url = sprintf('http://%s/v2/logout?client_id=%s&returnTo=%s', $domain, $client_id, $return_to); |
30 |
header('Location: ' . $logout_url); |
31 |
die(); |
Ini bekerja hampir sama dengan file login.php, akan tetapi hanya akan dipanggil ketika pengguna melakukan proses log out. Method logout
ini akan di panggil untuk mengakhiri session pengguna dalam aplikasi Anda. Setelah itu, pengguna akan dialihkan menuju Auth0 sehingga service akan diberitahu tentang aktivitas logout dari pengguna. Terakhir, pengguna akan diarahkan kembali menuju aplikasi Anda.
File Index
Akhirnya, mari kita lihat file index.php, yang merupakan titik masuk dari aplikasi kita.
1 |
<?php
|
2 |
// Require composer autoloader
|
3 |
require __DIR__ . '/vendor/autoload.php'; |
4 |
require __DIR__ . '/dotenv-loader.php'; |
5 |
use Auth0\SDK\Auth0; |
6 |
$domain = getenv('AUTH0_DOMAIN'); |
7 |
$client_id = getenv('AUTH0_CLIENT_ID'); |
8 |
$client_secret = getenv('AUTH0_CLIENT_SECRET'); |
9 |
$redirect_uri = getenv('AUTH0_CALLBACK_URL'); |
10 |
$audience = getenv('AUTH0_AUDIENCE'); |
11 |
if($audience == ''){ |
12 |
$audience = 'https://' . $domain . '/userinfo'; |
13 |
}
|
14 |
$auth0 = new Auth0([ |
15 |
'domain' => $domain, |
16 |
'client_id' => $client_id, |
17 |
'client_secret' => $client_secret, |
18 |
'redirect_uri' => $redirect_uri, |
19 |
'audience' => $audience, |
20 |
'scope' => 'openid profile', |
21 |
'persist_id_token' => true, |
22 |
'persist_access_token' => true, |
23 |
'persist_refresh_token' => true, |
24 |
]);
|
25 |
$userInfo = $auth0->getUser(); |
26 |
?>
|
27 |
<html>
|
28 |
<head>
|
29 |
<script src="http://code.jquery.com/jquery-3.1.0.min.js" type="text/javascript"></script> |
30 |
|
31 |
<meta name="viewport" content="width=device-width, initial-scale=1"> |
32 |
|
33 |
<!-- font awesome from BootstrapCDN -->
|
34 |
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"> |
35 |
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet"> |
36 |
|
37 |
<link href="public/app.css" rel="stylesheet"> |
38 |
</head>
|
39 |
<body class="home"> |
40 |
<div class="container"> |
41 |
<div class="login-page clearfix"> |
42 |
<?php if(!$userInfo): ?> |
43 |
<div class="login-box auth0-box before"> |
44 |
<img src="https://i.cloudup.com/StzWWrY34s.png" /> |
45 |
<h3>Auth0 Example</h3> |
46 |
<p>Zero friction identity infrastructure, built for developers</p> |
47 |
<a class="btn btn-primary btn-lg btn-login btn-block" href="login.php">Sign In</a> |
48 |
</div>
|
49 |
<?php else: ?> |
50 |
<div class="logged-in-box auth0-box logged-in"> |
51 |
<h1 id="logo"><img src="//cdn.auth0.com/samples/auth0_logo_final_blue_RGB.png" /></h1> |
52 |
<img class="avatar" src="<?php echo $userInfo['picture'] ?>"/> |
53 |
<h2>Welcome <span class="nickname"><?php echo $userInfo['nickname'] ?></span></h2> |
54 |
<a class="btn btn-warning btn-logout" href="/logout.php">Logout</a> |
55 |
</div>
|
56 |
<?php endif ?> |
57 |
</div>
|
58 |
</div>
|
59 |
</body>
|
60 |
</html>
|
Di sini, kami telah menggunakan method getUser
dari objek $auth0
untuk melihat apakah ada session yang aktif. Jika tidak ada session yang aktif, kami akan menampilkan tautan Sign In, yang membawa pengguna menuju login.php dan memulai alur dari proses login. Di sisi lain, kami akan menyapa pengguna dan menampilkan tautan Logout jika pengguna sudah berhasil masuk.
Jadi itu adalah implementasi dasar dari aliran otentikasi untuk sisi server aplikasi.
Amankan API Khusus Anda Dengan OAuth2
Pada bagian ini, kita akan melihat bagaimana Anda dapat mengamankan API khusus Anda dengan menerapkan alur perizinan melalui kode otorisasi OAuth2. Saya harap Anda terbiasa dengan aliran standar perizinan melalui kode otorisasi karena kami tidak akan membahas detailnya. Lihat beberapa postingan kami yang lainnya di sini pada Envato Tuts+ jika Anda ingin memahami OAuth2 dengan Cepat.
Sebaliknya, kami akan langsung menyelami penerapan yang sebenarnya. Lanjutkan dan buat file auth_code_grant_example.php dengan konten berikut.
1 |
<?php
|
2 |
session_start(); |
3 |
|
4 |
if (!isset($_GET['code'])) { |
5 |
// Check if we need to show the "Sign In" link
|
6 |
$params = array ( |
7 |
'audience' => '{AUDIENCE}', |
8 |
'scope' => 'profile', |
9 |
'response_type' => 'code', |
10 |
'client_id' => '{CLIENT_ID}', |
11 |
'state' => 'SomeRandomString', |
12 |
'redirect_uri' => '{CALLBACK_URL}' |
13 |
);
|
14 |
|
15 |
$_SESSION['oauth2state']=$params['state']; |
16 |
$str_params = ''; |
17 |
foreach($params as $key=>$value) { |
18 |
$str_params .= $key . "=" . urlencode($value) . "&"; |
19 |
}
|
20 |
?>
|
21 |
|
22 |
<a href="https://{AUTH0_DOMAIN}/authorize?<?php echo $str_params;?>"> |
23 |
Sign In |
24 |
</a>
|
25 |
<?php
|
26 |
} elseif (empty($_GET['state']) || (isset($_SESSION['oauth2state']) && $_GET['state'] !== $_SESSION['oauth2state'])) { |
27 |
// If the "state" var is present in the $_GET, let's validate it
|
28 |
if (isset($_SESSION['oauth2state'])) { |
29 |
unset($_SESSION['oauth2state']); |
30 |
}
|
31 |
|
32 |
exit('Invalid state'); |
33 |
|
34 |
} elseif(isset($_GET['code']) && !empty($_GET['code'])) { |
35 |
// If the auth "code" is present in the $_GET
|
36 |
// let's exchange it for the access token
|
37 |
$params = array ( |
38 |
'grant_type' => 'authorization_code', |
39 |
'client_id' => '{CLIENT_ID}', |
40 |
'client_secret' => '{CLIENT_SECRET}', |
41 |
'code' => $_GET['code'], |
42 |
'redirect_uri' => '{CALLBACK_URL}' |
43 |
);
|
44 |
|
45 |
$str_params = ''; |
46 |
foreach($params as $key=>$value) { |
47 |
$str_params .= $key . "=" . urlencode($value) . "&"; |
48 |
}
|
49 |
|
50 |
$curl = curl_init(); |
51 |
|
52 |
curl_setopt_array($curl, array( |
53 |
CURLOPT_URL => "https://{AUTH0_DOMAIN}/oauth/token", |
54 |
CURLOPT_RETURNTRANSFER => true, |
55 |
CURLOPT_CUSTOMREQUEST => "POST", |
56 |
CURLOPT_POSTFIELDS => $str_params |
57 |
));
|
58 |
|
59 |
$curl_response = curl_exec($curl); |
60 |
$curl_error = curl_error($curl); |
61 |
|
62 |
curl_close($curl); |
63 |
|
64 |
if ($curl_error) { |
65 |
echo "Error in the CURL response:" . $curl_error; |
66 |
} else { |
67 |
$arr_json_data = json_decode($curl_response); |
68 |
|
69 |
if (isset($arr_json_data->access_token)) { |
70 |
$access_token = $arr_json_data->access_token; |
71 |
$curl = curl_init(); |
72 |
|
73 |
curl_setopt_array($curl, array( |
74 |
CURLOPT_URL => "http://{YOUR_API_DOMAIN}/demo_api_server.php", |
75 |
CURLOPT_RETURNTRANSFER => true, |
76 |
CURLOPT_CUSTOMREQUEST => "GET", |
77 |
CURLOPT_HTTPHEADER => array( |
78 |
"Authorization: Bearer {$access_token}" |
79 |
)
|
80 |
));
|
81 |
|
82 |
$curl_response = curl_exec($curl); |
83 |
$curl_error = curl_error($curl); |
84 |
|
85 |
curl_close($curl); |
86 |
|
87 |
if ($curl_error) { |
88 |
echo "Error in the CURL response from DEMO API:" . $curl_error; |
89 |
} else { |
90 |
echo "Demo API Response:" . $curl_response; |
91 |
}
|
92 |
} else { |
93 |
echo 'Invalid response, no access token was found.'; |
94 |
}
|
95 |
}
|
96 |
}
|
Mari kita lihat bagaimana kode ini bekerja!
Memulai Arus Otorisasi
Pertama, kami menyiapkan tautan yang mengirim pengguna menuju server Auth0 untuk memulai aliran otorisasi.
1 |
// Check if we need to show the "Sign In" link
|
2 |
$params = array ( |
3 |
'audience' => '{AUDIENCE}', |
4 |
'scope' => 'profile', |
5 |
'response_type' => 'code', |
6 |
'client_id' => '{CLIENT_ID}', |
7 |
'state' => '{SOME_RANDOM_STRING}', |
8 |
'redirect_uri' => '{CALLBACK_URL}' |
9 |
);
|
10 |
|
11 |
$_SESSION['oauth2state']=$params['state']; |
12 |
$str_params = ''; |
13 |
foreach($params as $key=>$value) { |
14 |
$str_params .= $key . "=" . urlencode($value) . "&"; |
15 |
}
|
16 |
?>
|
17 |
|
18 |
<a href="https://{AUTH0_DOMAIN}/authorize?<?php echo $str_params;?>"> |
19 |
Sign In |
20 |
</a>
|
Silahkan ganti {AUDIENCE}
, {CLIENT_ID}
, dan {CALLBACK_URL}
dengan nilai yang sesuai dengan aplikasi Anda. Parameter {AUDIENCE}
harus diganti dengan bagian nilai Identifier yang ditemukan di dalam APIs > {YOUR API APPLICATION} > Settings pada dashboard Auth0.
{SOME_RANDOM_STRING} harus diganti dengan nilai unik yang sulit ditebak. String ini digunakan untuk mencegah serangan CSRF. Juga, pastikan untuk mengganti {AUTH0_DOMAIN}
dengan nama domain Anda, seperti yang telah kita bahas sebelumnya.
Mendapatkan Akses Token
Saat pengguna melakukan proses klik pada tautan Sign In, mereka akan diarahkan menuju server Auth0 untuk autentikasi. Setelah otentikasi, mereka akan diminta untuk mengotorisasi akses aplikasi ke profil Anda. Setelah otorisasi, pengguna akan diarahkan kembali menuju aplikasi Anda dengan code
sebagai parameter $_GET
.
Selanjutnya, kita dapat menukarkan code
ini untuk mendapatkan akses token.
1 |
// If the auth "code" is present in the $_GET
|
2 |
// let's exchange it for the access token
|
3 |
$params = array ( |
4 |
'grant_type' => 'authorization_code', |
5 |
'client_id' => '{CLIENT_ID}', |
6 |
'client_secret' => '{CLIENT_SECRET}', |
7 |
'code' => $_GET['code'], |
8 |
'redirect_uri' => '{CALLBACK_URL}' |
9 |
);
|
10 |
|
11 |
$str_params = ''; |
12 |
foreach($params as $key=>$value) { |
13 |
$str_params .= $key . "=" . urlencode($value) . "&"; |
14 |
}
|
15 |
|
16 |
$curl = curl_init(); |
17 |
$curl_response = curl_exec($curl); |
18 |
|
19 |
curl_setopt_array($curl, array( |
20 |
CURLOPT_URL => "https://{AUTH0_DOMAIN}/oauth/token", |
21 |
CURLOPT_RETURNTRANSFER => true, |
22 |
CURLOPT_CUSTOMREQUEST => "POST", |
23 |
CURLOPT_POSTFIELDS => $str_params |
24 |
));
|
Seperti yang Anda lihat, dibutuhkan satu panggilan CURL untuk mengambil akses token.
Memanggil Endpoint API Khusus Anda
Setelah Anda memiliki akses token, Anda dapat memanggil endpoint API khusus Anda dengan menyertakannya di header.
1 |
$access_token = $arr_json_data->access_token; |
2 |
$curl = curl_init(); |
3 |
|
4 |
curl_setopt_array($curl, array( |
5 |
CURLOPT_URL => "http://{YOUR_API_DOMAIN}/demo_api_server.php", |
6 |
CURLOPT_RETURNTRANSFER => true, |
7 |
CURLOPT_CUSTOMREQUEST => "GET", |
8 |
CURLOPT_HTTPHEADER => array( |
9 |
"Authorization: Bearer {$access_token}" |
10 |
)
|
11 |
));
|
12 |
|
13 |
$curl_response = curl_exec($curl); |
14 |
$curl_error = curl_error($curl); |
15 |
|
16 |
curl_close($curl); |
17 |
|
18 |
if ($curl_error) { |
19 |
echo "Error in the CURL response from DEMO API:" . $curl_error; |
20 |
} else { |
21 |
echo "Demo API Response:" . $curl_response; |
22 |
}
|
Melindungi API Endpoint Auth0
Nama fiktif sumber API file adalah demo_api_server.php mungkin terlihat seperti ini:
1 |
<?php
|
2 |
// Require composer autoloader
|
3 |
require __DIR__ . '/vendor/autoload.php'; |
4 |
|
5 |
use Auth0\SDK\JWTVerifier; |
6 |
|
7 |
try { |
8 |
$verifier = new JWTVerifier([ |
9 |
'supported_algs' => ['{HASHING_ALGORITHM}'], |
10 |
'valid_audiences' => ['{AUDIENCE}'], |
11 |
'authorized_iss' => ['{DOMAIN}'] |
12 |
]);
|
13 |
|
14 |
$access_token = getBearerToken(); |
15 |
$token_info = $verifier->verifyAndDecode($access_token); |
16 |
|
17 |
echo json_encode(array('date'=>'API Resource Data!!')); |
18 |
}
|
19 |
catch(\Auth0\SDK\Exception\CoreException $e) { |
20 |
throw $e; |
21 |
echo json_encode(array('error'=>$e->getMessage())); |
22 |
}
|
23 |
|
24 |
function getAuthorizationHeader() { |
25 |
$headers = null; |
26 |
|
27 |
if (isset($_SERVER['Authorization'])) { |
28 |
$headers = trim($_SERVER["Authorization"]); |
29 |
}
|
30 |
else if (isset($_SERVER['HTTP_AUTHORIZATION'])) { //Nginx or fast CGI |
31 |
$headers = trim($_SERVER["HTTP_AUTHORIZATION"]); |
32 |
} elseif (function_exists('apache_request_headers')) { |
33 |
$requestHeaders = apache_request_headers(); |
34 |
// Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care about capitalization for Authorization)
|
35 |
$requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders)); |
36 |
//print_r($requestHeaders);
|
37 |
if (isset($requestHeaders['Authorization'])) { |
38 |
$headers = trim($requestHeaders['Authorization']); |
39 |
}
|
40 |
}
|
41 |
return $headers; |
42 |
}
|
43 |
|
44 |
function getBearerToken() { |
45 |
$headers = getAuthorizationHeader(); |
46 |
|
47 |
// HEADER: Get the access token from the header
|
48 |
if (!empty($headers)) { |
49 |
if (preg_match('/Bearer\s(\S+)/', $headers, $matches)) { |
50 |
return $matches[1]; |
51 |
}
|
52 |
}
|
53 |
return null; |
54 |
}
|
Mari dengan cepat kita lalui bagian penting dari kode ini.
Memvalidasi Akses Token
Merupakan tanggung jawab Anda untuk memvalidasi akses token masuk sebelum Anda memberikan akses ke sumber yang dilindungi. Dan itulah yang kami lakukan pada snippet berikut. Kami telah menggunakan utilitas class JWTVerifier
untuk memvalidasi akses token.
1 |
try { |
2 |
$verifier = new JWTVerifier([ |
3 |
'supported_algs' => ['{SIGNING_ALGORITHM}'], |
4 |
'valid_audiences' => ['{AUDIENCE}'], |
5 |
'authorized_iss' => ['{DOMAIN}'] |
6 |
]);
|
7 |
|
8 |
$access_token = getBearerToken(); |
9 |
$token_info = $verifier->verifyAndDecode($access_token); |
10 |
|
11 |
echo json_encode(array('date'=>'API Resource Data!!')); |
12 |
}
|
13 |
catch(\Auth0\SDK\Exception\CoreException $e) { |
14 |
throw $e; |
15 |
echo json_encode(array('error'=>$e->getMessage())); |
16 |
}
|
{SIGNING_ALGORITHM}
harus diganti dengan nilai Signing Algorithm yang ditemukan di dalam APIs > {YOUR API APPLICATION} > Settings.
Jadi, itulah cara Anda melindungi API khusus jika Anda ingin menggunakan aliran OAuth2 pada layanan Auth0.
Kesimpulan
Hari ini, kita telah melewati layanan Auth0, yang menyediakan otentikasi dan otorisasi sebagai layanan. Setelah memperkenalkan layanan Auth0, kita telah melalui beberapa contoh praktis untuk menunjukkan bagaimana Anda dapat mengintegrasikannya dengan aplikasi PHP Anda.
Jangan ragu untuk mengirim saran dan pertanyaan Anda menggunakan kolom komentar di bawah ini!