Indonesian (Bahasa Indonesia) translation by Imam Firmansyah (you can also view the original English article)
Dalam artikel ini, kita akan mengeksplorasi bagaimana anda dapat menyiapkan server OAuth2 lengkap di Laravel menggunakan Passport library Laravel. Kita akan membahas konfigurasi server yang diperlukan bersama dengan contoh nyata untuk menunjukkan bagaimana anda dapat menggunakan OAuth2 API.
Saya berasumsi bahwa anda memahami konsep dasar OAuth2 dan alurnya saat kita akan mendiskusikannya dalam konteks Laravel. Sebenarnya, Passport library Laravel membuat anda cukup mudah untuk menyiapkan server OAuth2 dengan cepat di aplikasi anda. Dengan demikian, aplikasi pihak ketiga lainnya dapat menggunakan API yang disediakan oleh aplikasi anda.
Di bagian pertama artikel, kita akan memasang dan mengonfigurasi pustaka yang diperlukan, dan paruh kedua membahas cara menyiapkan sumber daya demo di aplikasi anda dan menggunakannya dari aplikasi pihak ketiga.
Konfigurasi Server
Di bagian ini, kita akan menginstal dependensi yang diperlukan untuk membuat library Passport dengan Laravel. Setelah instalasi, ada sedikit konfigurasi yang harus kita lalui sehingga Laravel dapat mendeteksi Passport library.
Mari kita lanjutkan dan install Passport library menggunakan composer.
1 |
$composer require laravel/passport
|
Hal itu cukup banyak untuk instalasi Passport library yang bersangkutan. Sekarang mari kita pastikan Laravel tahu tentang ini.
Dengan menggunakan Laravel, anda mungkin menyadari konsep service provider yang memungkinkan anda untuk mengonfigurasi layanan dalam aplikasi anda. Jadi, kapan pun anda ingin mengaktifkan layanan baru di aplikasi Laravel anda, anda hanya perlu menambahkan entri service provider terkait di config/app.php
.
Jika Anda belum mengetahui Laravel service provider, saya akan sangat menyarankan Anda melakukan sesuatu untuk diri Anda sendiri melalui artikel pengantar ini yang menjelaskan dasar-dasar service provider di Laravel.
Dalam kasus ini, kita hanya perlu menambahkan PassportServiceProvider
ke daftar service provider di config/app.php
seperti yang ditunjukkan pada cuplikan berikut.
1 |
...
|
2 |
...
|
3 |
'providers' => [ |
4 |
|
5 |
/*
|
6 |
* Laravel Framework Service Providers...
|
7 |
*/
|
8 |
Illuminate\Auth\AuthServiceProvider::class, |
9 |
Illuminate\Broadcasting\BroadcastServiceProvider::class, |
10 |
Illuminate\Bus\BusServiceProvider::class, |
11 |
Illuminate\Cache\CacheServiceProvider::class, |
12 |
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, |
13 |
Illuminate\Cookie\CookieServiceProvider::class, |
14 |
Illuminate\Database\DatabaseServiceProvider::class, |
15 |
Illuminate\Encryption\EncryptionServiceProvider::class, |
16 |
Illuminate\Filesystem\FilesystemServiceProvider::class, |
17 |
Illuminate\Foundation\Providers\FoundationServiceProvider::class, |
18 |
Illuminate\Hashing\HashServiceProvider::class, |
19 |
Illuminate\Mail\MailServiceProvider::class, |
20 |
Illuminate\Notifications\NotificationServiceProvider::class, |
21 |
Illuminate\Pagination\PaginationServiceProvider::class, |
22 |
Illuminate\Pipeline\PipelineServiceProvider::class, |
23 |
Illuminate\Queue\QueueServiceProvider::class, |
24 |
Illuminate\Redis\RedisServiceProvider::class, |
25 |
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, |
26 |
Illuminate\Session\SessionServiceProvider::class, |
27 |
Illuminate\Translation\TranslationServiceProvider::class, |
28 |
Illuminate\Validation\ValidationServiceProvider::class, |
29 |
Illuminate\View\ViewServiceProvider::class, |
30 |
|
31 |
/*
|
32 |
* Package Service Providers...
|
33 |
*/
|
34 |
Laravel\Tinker\TinkerServiceProvider::class, |
35 |
|
36 |
/*
|
37 |
* Application Service Providers...
|
38 |
*/
|
39 |
App\Providers\AppServiceProvider::class, |
40 |
App\Providers\AuthServiceProvider::class, |
41 |
App\Providers\BroadcastServiceProvider::class, |
42 |
App\Providers\EventServiceProvider::class, |
43 |
App\Providers\RouteServiceProvider::class, |
44 |
Laravel\Passport\PassportServiceProvider::class, |
45 |
],
|
46 |
...
|
47 |
...
|
Selanjutnya, kita perlu menjalankan perintah migrate
yang akan membuat tabel yang diperlukan dalam database untuk Passport library.
1 |
$php artisan migrate
|
Tepatnya, ia menciptakan tabel mengikuti bentuk tabel dalam database.
1 |
oauth_access_tokens
|
2 |
oauth_auth_codes
|
3 |
oauth_clients
|
4 |
oauth_personal_access_clients
|
5 |
oauth_refresh_tokens
|
Selanjutnya, kita perlu membuat sepasang public key dan private key yang akan digunakan oleh Passport library untuk enkripsi. Seperti yang diharapkan, Passport library menyediakan artisan command untuk membuatnya dengan mudah.
1 |
$php artisan passport:install
|
Command diatas seharusnya membuat key di storage/oauth-public.key
dan storage/oauth-private.key
. Ia juga menciptakan beberapa demo client yang kredensial yang akan kita bahas nanti.
Selanjutnya, mari kita oauthify User model class yang sudah ada sebelumnya menggunakan Laravel untuk otentikasi. Untuk melakukan itu, kita perlu menambahkan HasApiTokens
ke dalam User
model class. Mari kita lakukan seperti yang ditunjukkan pada cuplikan berikut.
1 |
<?php
|
2 |
|
3 |
namespace App; |
4 |
|
5 |
use Illuminate\Notifications\Notifiable; |
6 |
use Illuminate\Foundation\Auth\User as Authenticatable; |
7 |
use Laravel\Passport\HasApiTokens; |
8 |
|
9 |
class User extends Authenticatable |
10 |
{
|
11 |
use HasApiTokens; |
12 |
|
13 |
/**
|
14 |
* The attributes that are mass assignable.
|
15 |
*
|
16 |
* @var array
|
17 |
*/
|
18 |
protected $fillable = [ |
19 |
'name', 'email', 'password', |
20 |
];
|
21 |
|
22 |
/**
|
23 |
* The attributes that should be hidden for arrays.
|
24 |
*
|
25 |
* @var array
|
26 |
*/
|
27 |
protected $hidden = [ |
28 |
'password', 'remember_token', |
29 |
];
|
30 |
}
|
HasApiTokens
berisi metode pembantu yang digunakan untuk memvalidasi token dalam permintaan dan memeriksa ruang lingkup sumber daya yang diminta dalam konteks user yang saat ini terautentikasi.
Selanjutnya, kita perlu mendaftarkan route yang disediakan oleh Passport library dengan aplikasi Laravel kita. Route ini akan digunakan untuk operasi OAuth2 standar seperti otorisasi, meminta token akses, dan sejenisnya.
Dalam boot file app/Providers/AuthServiceProvider.php
mari daftarkan route Passport library.
1 |
...
|
2 |
...
|
3 |
/**
|
4 |
* Register any authentication / authorization services.
|
5 |
*
|
6 |
* @return void
|
7 |
*/
|
8 |
public function boot() |
9 |
{
|
10 |
$this->registerPolicies(); |
11 |
|
12 |
Passport::routes(); |
13 |
}
|
14 |
...
|
15 |
...
|
Terakhir, kita perlu mengubah api
driver dari token ke passport di file config/auth.php
, karena kita akan menggunakan Passport library untuk otentikasi API.
1 |
'guards' => [ |
2 |
'web' => [ |
3 |
'driver' => 'session', |
4 |
'provider' => 'users', |
5 |
],
|
6 |
|
7 |
'api' => [ |
8 |
'driver' => 'passport', |
9 |
'provider' => 'users', |
10 |
],
|
11 |
],
|
Sejauh ini, kita telah melakukan semua yang diperlukan menyangkut konfigurasi server OAuth2.
Mengatur Demo Resources
Di bagian sebelumnya, kita telah bekerja keras untuk menyiapkan server otentikasi OAuth2 di aplikasi kita. Di bagian ini, kita akan menyiapkan demo resources yang dapat di request melalui API call.
Kita akan mencoba tetap sederhana. Demo resources kita akan mengembalikan informasi pengguna dengan ketentuan yang terdapat pada uid
parameter yang valid di dalam GET
request.
Mari buat file controller app/Http/Controllers/UserController.php
dengan konten berikut.
1 |
<?php
|
2 |
namespace App\Http\Controllers; |
3 |
|
4 |
use App\Http\Controllers\Controller; |
5 |
use Illuminate\Http\Request; |
6 |
use App\User; |
7 |
|
8 |
class UserController extends Controller |
9 |
{
|
10 |
public function get(Request $request) |
11 |
{
|
12 |
$user_id = $request->get("uid", 0); |
13 |
$user = User::find($user_id); |
14 |
return $user; |
15 |
}
|
16 |
}
|
Seperti biasa, Anda perlu menambahkan route yang terkait juga, yang seharusnya Anda tambahkan dalam file routes/web.php
file. But what we are talking about is the API route, and thus it needs special treatment.
API route didefinisikan dalam file routes/api.php
. Jadi, mari kita lanjutkan dan tambahkan API route yang sudah kita sesuaikan seperti yang ditunjukkan pada cuplikan berikut.
1 |
<?php
|
2 |
|
3 |
use Illuminate\Http\Request; |
4 |
|
5 |
/*
|
6 |
|--------------------------------------------------------------------------
|
7 |
| API Routes
|
8 |
|--------------------------------------------------------------------------
|
9 |
|
|
10 |
| Here is where you can register API routes for your application. These
|
11 |
| routes are loaded by the RouteServiceProvider within a group which
|
12 |
| is assigned the "api" middleware group. Enjoy building your API!
|
13 |
|
|
14 |
*/
|
15 |
|
16 |
Route::middleware('auth:api')->get('/user', function (Request $request) { |
17 |
return $request->user(); |
18 |
});
|
19 |
|
20 |
// custom API route
|
21 |
Route::middleware('auth:api')->get('/user/get', 'UserController@get'); |
Meskipun kita mendefinisikannya sebagai /user/get
, API route yang efektif adalah /api/user/get
, dan itulah yang harus Anda gunakan ketika Anda melakukan request resource atas route tersebut. Awalan api
secara otomatis ditangani oleh Laravel, dan Anda tidak perlu khawatir tentang itu!
Di bagian berikutnya dan terakhir, kita akan membahas bagaimana Anda dapat membuat client credentials dan menggunakan OAuth2 API.
Cara Menggunakan API OAuth2
Sekarang setelah kita menyiapkan server OAuth2 di aplikasi kita, pihak ketiga dapat terhubung ke server kita dengan OAuth dan menggunakan API yang tersedia di aplikasi kita.
Pertama-tama, aplikasi pihak ketiga harus mendaftar dengan aplikasi kita untuk dapat menggunakan API. Dengan kata lain, mereka dianggap sebagai aplikasi client, dan mereka akan menerima id clinet dan client secret setelah pendaftaran.
Library Passport menyediakan artisan command untuk membuat akun client tanpa banyak kerumitan. Mari kita lanjutkan dan membuat akun demo client.
1 |
$php artisan passport:client
|
2 |
Which user ID should the client be assigned to?: |
3 |
> 1
|
4 |
|
5 |
What should we name the client?: |
6 |
> Demo OAuth2 Client Account
|
7 |
|
8 |
Where should we redirect the request after authorization? [https://localhost/auth/callback]:
|
9 |
> http://localhost/oauth2_client/callback.php
|
10 |
|
11 |
New client created successfully. |
12 |
Client ID: 1 |
13 |
Client secret: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01 |
Ketika Anda menjalankan command artisan passport:client
, ia menanyakan beberapa pertanyaan sebelum membuat akun client. Dari semua itu, hal terpenting yang ditanyakan kepada Anda adalah tentang callback URL
.
Callback URL
adalah tempat pengguna akan diarahkan kembali ke pihak ketiga setelah otorisasi. Dan di sanalah kode otorisasi yang seharusnya digunakan dalam pertukaran untuk token akses akan dikirim. Kita akan membuat file itu sebentar lagi.
Sekarang, kita siap menguji OAuth2 API di aplikasi Laravel.
Untuk tujuan demonstrasi, pertama-tama saya akan membuat direktori oauth2_client
di bawah document root. Idealnya, file-file ini akan ditempatkan di ujung pihak ketiga yang ingin menggunakan API dalam aplikasi Laravel kita.
Mari kita buat file oauth2_client/auth_redirection.php
dengan isi sebagai berikut.
1 |
<?php
|
2 |
$query = http_build_query(array( |
3 |
'client_id' => '1', |
4 |
'redirect_uri' => 'http://localhost/oauth2_client/callback.php', |
5 |
'response_type' => 'code', |
6 |
'scope' => '', |
7 |
));
|
8 |
|
9 |
header('Location: http://your-laravel-site-url/oauth/authorize?'.$query); |
Pastikan untuk mengubah parameter client_id
and redirect_uri
untuk mencerminkan pengaturan Anda sendiri — yang Anda gunakan saat membuat akun demo client.
Selanjutnya, mari kita buat file oauth2_client/callback.php
engan konten berikut.
1 |
<?php
|
2 |
// check if the response includes authorization_code
|
3 |
if (isset($_REQUEST['code']) && $_REQUEST['code']) |
4 |
{
|
5 |
$ch = curl_init(); |
6 |
$url = 'http://your-laravel-site-url/oauth/token'; |
7 |
|
8 |
$params = array( |
9 |
'grant_type' => 'authorization_code', |
10 |
'client_id' => '1', |
11 |
'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', |
12 |
'redirect_uri' => 'http://localhost/oauth2_client/callback.php', |
13 |
'code' => $_REQUEST['code'] |
14 |
);
|
15 |
|
16 |
curl_setopt($ch,CURLOPT_URL, $url); |
17 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
18 |
|
19 |
$params_string = ''; |
20 |
|
21 |
if (is_array($params) && count($params)) |
22 |
{
|
23 |
foreach($params as $key=>$value) { |
24 |
$params_string .= $key.'='.$value.'&'; |
25 |
}
|
26 |
|
27 |
rtrim($params_string, '&'); |
28 |
|
29 |
curl_setopt($ch,CURLOPT_POST, count($params)); |
30 |
curl_setopt($ch,CURLOPT_POSTFIELDS, $params_string); |
31 |
}
|
32 |
|
33 |
$result = curl_exec($ch); |
34 |
curl_close($ch); |
35 |
$response = json_decode($result); |
36 |
|
37 |
// check if the response includes access_token
|
38 |
if (isset($response->access_token) && $response->access_token) |
39 |
{
|
40 |
// you would like to store the access_token in the session though...
|
41 |
$access_token = $response->access_token; |
42 |
|
43 |
// use above token to make further api calls in this session or until the access token expires
|
44 |
$ch = curl_init(); |
45 |
$url = 'http://your-laravel-site-url/api/user/get'; |
46 |
$header = array( |
47 |
'Authorization: Bearer '. $access_token |
48 |
);
|
49 |
$query = http_build_query(array('uid' => '1')); |
50 |
|
51 |
curl_setopt($ch,CURLOPT_URL, $url . '?' . $query); |
52 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
53 |
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); |
54 |
$result = curl_exec($ch); |
55 |
curl_close($ch); |
56 |
$response = json_decode($result); |
57 |
var_dump($result); |
58 |
}
|
59 |
else
|
60 |
{
|
61 |
// for some reason, the access_token was not available
|
62 |
// debugging goes here
|
63 |
}
|
64 |
}
|
Sekali lagi, pastikan untuk menyesuaikan URL dan client credentials sesuai dengan pengaturan Anda pada file di atas.
Bagaimana Cara Kerjanya Secara Keseluruhan
Di bagian ini, kita akan mengujinya secara keseluruhan dari perspektif end user. Sebagai end user, akan ada dua aplikasi di depan Anda:
- Yang pertama adalah aplikasi Laravel yang terdapat akun anda didalamnya. Akun ini memegang informasi Anda yang dapat Anda bagikan dengan aplikasi pihak ketiga lainnya.
- Yang kedua adalah aplikasi demo client pihak ketiga,
auth_redirection.php
dancallback.php
, yang ingin mengambil informasi Anda dari aplikasi Laravel menggunakan OAuth API.
Alurnya dimulai dari aplikasi client pihak ketiga. Lanjutkan dan bukae http://localhost/oauth2_client/auth_redirection.php URL di browser Anda, dan itu harus mengarahkan Anda ke aplikasi Laravel. Jika Anda belum masuk ke aplikasi Laravel, aplikasi akan meminta Anda untuk melakukannya terlebih dahulu.
Setelah user masuk, aplikasi akan menampilkan halaman otorisasi.
Jika user mengotorisasi permintaan itu, user akan dialihkan kembali ke aplikasi client pihak ketiga di http://localhost/oauth2_client/callback.php bersama dengan code
sebagai parameter GET
yang berisi kode otorisasi.
Setelah aplikasi pihak ketiga menerima kode otorisasi, aplikasi pihak ketiga bisa menukar kode itu dengan aplikasi Laravel untuk mendapatkan token akses. Dan itulah yang dilakukan dalam potongan file oauth2_client/callback.php
berikut.
1 |
$ch = curl_init(); |
2 |
$url = 'http://your-laravel-site-url/oauth/token'; |
3 |
|
4 |
$params = array( |
5 |
'grant_type' => 'authorization_code', |
6 |
'client_id' => '1', |
7 |
'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', |
8 |
'redirect_uri' => 'http://localhost/oauth2_client/callback.php', |
9 |
'code' => $_REQUEST['code'] |
10 |
);
|
11 |
|
12 |
curl_setopt($ch,CURLOPT_URL, $url); |
13 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
14 |
|
15 |
$params_string = ''; |
16 |
|
17 |
if (is_array($params) && count($params)) |
18 |
{
|
19 |
foreach($params as $key=>$value) { |
20 |
$params_string .= $key.'='.$value.'&'; |
21 |
}
|
22 |
|
23 |
rtrim($params_string, '&'); |
24 |
|
25 |
curl_setopt($ch,CURLOPT_POST, count($params)); |
26 |
curl_setopt($ch,CURLOPT_POSTFIELDS, $params_string); |
27 |
}
|
28 |
|
29 |
$result = curl_exec($ch); |
30 |
curl_close($ch); |
31 |
$response = json_decode($result); |
Selanjutnya, pertama-tama aplikasi pihak ketiga memeriksa respons CURL request untuk melihat apakah itu berisi token akses yang valid.
Segera setelah aplikasi pihak ketiga mendapatkan token akses, mereka bisa menggunakan token itu untuk membuat API call lebih lanjut untuk melakukan request resource yang diperlukan dari aplikasi Laravel. Tentu saja, token akses harus diteruskan di setiap request yang meminta resource dari aplikasi Laravel.
Kita telah mencoba untuk meniru use-case karena aplikasi pihak ketiga yang ingin mengakses informasi user dari aplikasi Laravel. Dan kita telah membangun titik akhir API, http://your-laravel-site-url/api/user/get, dalam aplikasi Laravel yang memfasilitasi itu.
1 |
// check if the response includes access_token
|
2 |
if (isset($response->access_token) && $response->access_token) |
3 |
{
|
4 |
// you would like to store the access_token in the session though...
|
5 |
$access_token = $response->access_token; |
6 |
|
7 |
// use above token to make further api calls in this session or until the access token expires
|
8 |
$ch = curl_init(); |
9 |
$url = 'http://your-laravel-site-url/api/user/get'; |
10 |
$header = array( |
11 |
'Authorization: Bearer '. $access_token |
12 |
);
|
13 |
$query = http_build_query(array('uid' => '1')); |
14 |
|
15 |
curl_setopt($ch,CURLOPT_URL, $url . '?' . $query); |
16 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
17 |
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); |
18 |
$result = curl_exec($ch); |
19 |
curl_close($ch); |
20 |
$response = json_decode($result); |
21 |
var_dump($result); |
22 |
}
|
Jadi itulah alur lengkap bagaimana Anda seharusnya menggunakan OAuth2 API di Laravel.
Dan dengan itu, kita telah mencapai akhir artikel ini.
Kesimpulan
Hari ini, kita mengeskplorasi Passport library di Laravel, yang memungkinkan kita untuk menyiapkan server OAuth2 dalam aplikasi dengan sangat mudah.
Bagi Anda yang baru saja memulai dengan Laravel atau mencari cara untuk memperluas pengetahuan, situs, atau aplikasi dengan ekstensi, kami memiliki berbagai hal yang dapat Anda pelajari di Envato Market.
Jangan ragu untuk membagikan pemikiran dan pertanyaan Anda menggunakan feed di bawah ini!