Otentikasi jwt membutuhkan firebase/php-jwt library drupal 8

Ada saat ketika satu-satunya cara untuk mengautentikasi diri Anda dengan aplikasi adalah dengan memberikan kredensial Anda (biasanya nama pengguna atau alamat email dan kata sandi) dan sebuah sesi kemudian digunakan untuk mempertahankan status pengguna hingga pengguna keluar. Beberapa saat kemudian, kami mulai menggunakan API autentikasi. Dan belakangan ini, JWT, atau Token Web JSON, semakin banyak digunakan sebagai cara lain untuk mengautentikasi permintaan ke server

Dalam artikel ini, Anda akan mempelajari apa itu JWT dan cara menggunakannya dengan PHP untuk membuat permintaan pengguna yang diautentikasi

Otentikasi jwt membutuhkan firebase/php-jwt library drupal 8

JWT versus Sesi

Tapi pertama-tama, mengapa sesi bukan hal yang baik?

  • Data disimpan dalam teks biasa di server
    Meskipun data biasanya tidak disimpan di folder publik, siapa pun yang memiliki akses yang memadai ke server dapat membaca isi file sesi
  • Mereka melibatkan permintaan baca/tulis sistem file
    Setiap kali sesi dimulai atau datanya diubah, server perlu memperbarui file sesi. Hal yang sama berlaku untuk setiap kali aplikasi mengirimkan cookie sesi. Jika Anda memiliki banyak pengguna, Anda dapat berakhir dengan server yang lambat kecuali jika Anda menggunakan opsi penyimpanan sesi alternatif, seperti Memcached dan Redis
  • Aplikasi terdistribusi/Clustered
    Karena file sesi, secara default, disimpan di sistem file, sulit untuk memiliki infrastruktur terdistribusi atau berkerumun untuk aplikasi ketersediaan tinggi — aplikasi yang memerlukan penggunaan teknologi seperti penyeimbang beban dan server berkerumun. Media penyimpanan lain dan konfigurasi khusus harus diterapkan — dan dilakukan dengan kesadaran penuh akan implikasinya

JWT

Sekarang, mari kita mulai belajar tentang JWT. Spesifikasi Token Web JSON (RFC 7519) pertama kali diterbitkan pada 28 Desember 2010, dan terakhir diperbarui pada Mei 2015

JWT memiliki banyak keunggulan dibandingkan kunci API, termasuk

  • Kunci API adalah string acak, sedangkan JWT berisi informasi dan metadata. Informasi dan metadata ini dapat mendeskripsikan berbagai hal, seperti identitas pengguna, data otorisasi, dan validitas token dalam jangka waktu tertentu atau terkait dengan domain
  • JWT tidak memerlukan otoritas penerbitan atau pencabutan terpusat
  • JWT kompatibel dengan OAUTH2
  • Data JWT dapat diperiksa
  • JWT memiliki kontrol kedaluwarsa
  • JWT ditujukan untuk lingkungan yang dibatasi ruang, seperti header Otorisasi HTTP
  • Data ditransmisikan dalam format Notasi Objek JavaScript (JSON)
  • JWT direpresentasikan menggunakan pengkodean Base64url

Seperti Apa JWT Itu?

Berikut adalah contoh JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MTY5MjkxMDksImp0aSI6ImFhN2Y4ZDBhOTVjIiwic2NvcGVzIjpbInJlcG8iLCJwdWJsaWNfcmVwbyJdfQ.XCEwpBGvOLma4TCoh36FU7XhUbcskygS81HE1uHLf0E

Sepintas, tampak bahwa string hanyalah kumpulan karakter acak yang digabungkan dengan karakter titik atau titik. Dengan demikian, ini mungkin tidak jauh berbeda dari kunci API. Namun, jika diperhatikan lebih dekat, ada tiga senar yang terpisah

Tajuk JWT

String pertama adalah header JWT. Ini adalah string JSON yang disandikan dengan URL Base64. Ini menentukan algoritme kriptografi mana yang digunakan untuk menghasilkan tanda tangan, dan jenis token, yang selalu disetel ke

{
    "alg": "HS256",
    "typ": "JWT"
}
6. Algoritma dapat berupa simetris atau asimetris

Algoritme simetris menggunakan satu kunci untuk membuat dan memverifikasi token. Kuncinya dibagi antara pembuat JWT dan konsumennya. Sangat penting bagi Anda untuk memastikan hanya pencipta dan konsumen yang mengetahui rahasianya. Jika tidak, siapa pun dapat membuat token yang valid

Algoritme asimetris menggunakan kunci privat untuk menandatangani token dan kunci publik untuk memverifikasinya. Algoritma ini harus digunakan ketika rahasia yang dibagikan tidak praktis atau pihak lain hanya perlu memverifikasi integritas token

Muatan JWT

String kedua adalah muatan JWT. Ini juga merupakan string JSON yang disandikan dengan URL Base64. Ini berisi beberapa bidang standar, yang disebut sebagai "klaim". Ada tiga jenis klaim. terdaftar, publik, dan swasta

Klaim terdaftar sudah ditentukan sebelumnya. Anda dapat menemukan daftarnya di. Berikut adalah beberapa yang umum digunakan

  • {
        "alg": "HS256",
        "typ": "JWT"
    }
    
    _7. stempel waktu penerbitan token
  • {
        "alg": "HS256",
        "typ": "JWT"
    }
    
    _8. string unik, yang dapat digunakan untuk memvalidasi token, tetapi bertentangan dengan tidak adanya otoritas penerbit terpusat
  • {
        "alg": "HS256",
        "typ": "JWT"
    }
    
    _9. string yang berisi nama atau pengenal penerbit. Dapat berupa nama domain dan dapat digunakan untuk membuang token dari aplikasi lain
  • {
        "iat": 1416929109,
        "jti": "aa7f8d0a95c",
        "scopes": [
            "repo",
            "public_repo"
        ]
    }
    
    0. stempel waktu kapan token harus mulai dianggap valid. Harus sama dengan atau lebih besar dari
    {
        "alg": "HS256",
        "typ": "JWT"
    }
    
    _7
  • {
        "iat": 1416929109,
        "jti": "aa7f8d0a95c",
        "scopes": [
            "repo",
            "public_repo"
        ]
    }
    
    2. stempel waktu kapan token harus berhenti valid. Harus lebih besar dari
    {
        "alg": "HS256",
        "typ": "JWT"
    }
    
    7 dan
    {
        "iat": 1416929109,
        "jti": "aa7f8d0a95c",
        "scopes": [
            "repo",
            "public_repo"
        ]
    }
    
    0

Klaim publik dapat didefinisikan sesuai keinginan Anda. Namun, mereka tidak boleh sama dengan klaim terdaftar, atau klaim dari. Anda dapat membuat klaim pribadi sesuka hati. Mereka hanya untuk digunakan antara dua pihak. seorang produsen dan seorang konsumen

Tanda Tangan JWT

Tanda tangan JWT adalah mekanisme kriptografi yang dirancang untuk mengamankan data JWT dengan tanda tangan digital yang unik untuk konten token. Tanda tangan tersebut memastikan integritas JWT sehingga konsumen dapat memverifikasi bahwa JWT tidak dirusak oleh aktor jahat

Tanda tangan JWT adalah kombinasi dari tiga hal

  • tajuk JWT
  • muatan JWT
  • nilai rahasia

Ketiganya ditandatangani secara digital (tidak dienkripsi) menggunakan algoritme yang ditentukan di header JWT. Jika kita mendekode contoh di atas, kita akan memiliki string JSON berikut

Tajuk JWT

{
    "alg": "HS256",
    "typ": "JWT"
}
_

Data JWT

{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}

Coba jwt. io untuk Anda sendiri, di mana Anda dapat bermain-main dengan encoding dan decoding JWT Anda sendiri

Mari Gunakan JWT dalam Aplikasi Berbasis PHP

Sekarang setelah Anda mempelajari apa itu JWT, sekarang saatnya mempelajari cara menggunakannya dalam aplikasi PHP. Sebelum kita masuk lebih dalam, jangan ragu untuk mengkloning kode untuk artikel ini, atau ikuti terus dan buatlah seiring berjalannya waktu

Ada banyak cara yang dapat Anda lakukan untuk mengintegrasikan JWT, tetapi inilah cara kami akan melakukannya

Semua permintaan ke aplikasi, kecuali halaman masuk dan keluar, harus diautentikasi melalui JWT. Jika pengguna membuat permintaan tanpa JWT, mereka akan dialihkan ke halaman login

Setelah pengguna mengisi dan mengirimkan formulir login, formulir tersebut akan dikirimkan melalui JavaScript ke endpoint login,

{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}
5, di aplikasi kami. Titik akhir kemudian akan mengekstrak kredensial (nama pengguna dan kata sandi) dari permintaan dan memeriksa apakah valid

Jika ya, itu akan menghasilkan JWT dan mengirimkannya kembali ke klien. Ketika klien menerima JWT, itu akan menyimpannya dan menggunakannya dengan setiap permintaan di masa mendatang ke aplikasi

Untuk skenario sederhana, hanya akan ada satu sumber daya yang dapat diminta pengguna — sebuah file PHP dengan tepat bernama

{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}
6. Itu tidak akan berbuat banyak, hanya mengembalikan sebuah string, yang berisi stempel waktu saat ini pada saat permintaan

Ada beberapa cara untuk menggunakan JWT saat mengajukan permintaan. Dalam aplikasi kita, JWT akan dikirim di header otorisasi Bearer

Jika Anda tidak terbiasa dengan Otorisasi Pembawa, ini adalah bentuk autentikasi HTTP, di mana token (seperti JWT) dikirim dalam header permintaan. Server dapat memeriksa token dan menentukan apakah akses harus diberikan kepada “pembawa” token

Ini contoh headernya

Authorization: Bearer ab0dde18155a43ee83edba4a4542b973

Untuk setiap permintaan yang diterima oleh aplikasi kita, PHP akan mencoba mengekstrak token dari header Bearer. Jika ada, itu kemudian divalidasi. Jika valid, pengguna akan melihat respons normal untuk permintaan tersebut. Namun, jika JWT tidak valid, pengguna tidak akan diizinkan untuk mengakses sumber daya

Harap perhatikan bahwa JWT tidak dirancang untuk menggantikan cookie sesi

Prasyarat

Untuk memulainya, kita perlu menginstal PHP dan Composer di sistem kita

Di root proyek, jalankan

{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}
7. Ini akan menarik Firebase PHP-JWT, pustaka pihak ketiga yang menyederhanakan bekerja dengan JWT, serta laminas-config, yang dirancang untuk menyederhanakan akses ke data konfigurasi dalam aplikasi

Formulir Masuk

Otentikasi jwt membutuhkan firebase/php-jwt library drupal 8

Dengan perpustakaan terinstal, mari telusuri kode login di

{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}
5. Kami pertama-tama melakukan penyiapan seperti biasa, memastikan bahwa pemuat otomatis yang dihasilkan Komposer tersedia

<?php

declare(strict_types=1);

use Firebase\JWT\JWT;

require_once('../vendor/autoload.php');

Setelah menerima pengiriman formulir, kredensial divalidasi terhadap database, atau penyimpanan data lainnya. Untuk keperluan contoh ini, kami akan menganggap bahwa itu valid, dan menyetel

{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}
9 ke true

<?php

// extract credentials from the request

if ($hasValidCredentials) {

Selanjutnya, kami menginisialisasi satu set variabel yang akan digunakan untuk menghasilkan JWT. Harap diingat bahwa karena JWT dapat diperiksa di sisi klien, jangan sertakan informasi sensitif apa pun di dalamnya

Hal lain yang perlu diperhatikan, sekali lagi, adalah

Authorization: Bearer ab0dde18155a43ee83edba4a4542b973
0 tidak akan diinisialisasi seperti ini. Anda mungkin akan mengaturnya di lingkungan dan mengekstraknya, menggunakan pustaka seperti phpdotenv, atau dalam file konfigurasi. Saya menghindari melakukannya dalam contoh ini, karena saya ingin fokus pada kode JWT

Jangan pernah mengungkapkannya atau menyimpannya di bawah kendali versi

$secretKey  = 'bGS6lzFqvvSQ8ALbOxatm7/Vk7mLQyzqaS34Q4oR1ew=';
$issuedAt   = new DateTimeImmutable();
$expire     = $issuedAt->modify('+6 minutes')->getTimestamp();      // Add 60 seconds
$serverName = "your.domain.name";
$username   = "username";                                           // Retrieved from filtered POST data

$data = [
    'iat'  => $issuedAt->getTimestamp(),         // Issued at: time when the token was generated
    'iss'  => $serverName,                       // Issuer
    'nbf'  => $issuedAt->getTimestamp(),         // Not before
    'exp'  => $expire,                           // Expire
    'userName' => $username,                     // User name
];

Dengan data payload yang siap digunakan, selanjutnya kita menggunakan metode

Authorization: Bearer ab0dde18155a43ee83edba4a4542b973
1 statis php-jwt untuk membuat JWT

Metode

  • mengubah array menjadi JSON
  • menghasilkan header
  • menandatangani muatan
  • mengkodekan string terakhir

Dibutuhkan tiga parameter

  • informasi muatan
  • kunci rahasia
  • algoritma yang digunakan untuk menandatangani token

Dengan memanggil

Authorization: Bearer ab0dde18155a43ee83edba4a4542b973
_2 pada hasil fungsi, token yang dihasilkan dikembalikan

<?php
    // Encode the array to a JWT string.
    echo JWT::encode(
        $data,
        $secretKey,
        'HS512'
    );
}

Mengkonsumsi JWT

Otentikasi jwt membutuhkan firebase/php-jwt library drupal 8

Sekarang klien memiliki token, Anda dapat menyimpannya menggunakan JavaScript atau mekanisme apa pun yang Anda inginkan. Berikut adalah contoh cara melakukannya menggunakan vanilla JavaScript. Di

Authorization: Bearer ab0dde18155a43ee83edba4a4542b973
_3, setelah pengiriman formulir berhasil, JWT yang dikembalikan disimpan dalam memori, formulir login disembunyikan, dan tombol untuk meminta stempel waktu ditampilkan

const store = {};
const loginButton = document.querySelector('#frmLogin');
const btnGetResource = document.querySelector('#btnGetResource');
const form = document.forms[0];

// Inserts the jwt to the store object
store.setJWT = function (data) {
  this.JWT = data;
};

loginButton.addEventListener('submit', async (e) => {
  e.preventDefault();

  const res = await fetch('/authenticate.php', {
    method: 'POST',
    headers: {
      'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
    },
    body: JSON.stringify({
      username: form.inputEmail.value,
      password: form.inputPassword.value
    })
  });

  if (res.status >= 200 && res.status <= 299) {
    const jwt = await res.text();
    store.setJWT(jwt);
    frmLogin.style.display = 'none';
    btnGetResource.style.display = 'block';
  } else {
    // Handle errors
    console.log(res.status, res.statusText);
  }
});

Menggunakan JWT

Saat mengklik tombol "Dapatkan stempel waktu saat ini", permintaan GET dibuat untuk

{
    "iat": 1416929109,
    "jti": "aa7f8d0a95c",
    "scopes": [
        "repo",
        "public_repo"
    ]
}
6, yang menetapkan JWT yang diterima setelah autentikasi di header Otorisasi

btnGetResource.addEventListener('click', async (e) => {
  const res = await fetch('/resource.php', {
    headers: {
      'Authorization': `Bearer ${store.JWT}`
    }
  });
  const timeStamp = await res.text();
  console.log(timeStamp);
});

Saat kami mengklik tombol, permintaan yang mirip dengan yang berikut ini dibuat

{
    "alg": "HS256",
    "typ": "JWT"
}
_0

Dengan asumsi JWT itu valid, kita akan melihat sumber dayanya, setelah itu responsnya ditulis ke konsol

Memvalidasi JWT

Terakhir, mari kita lihat bagaimana kita dapat memvalidasi token di PHP. Seperti biasa, kami menyertakan autoloader Composer. Kemudian, secara opsional, kami dapat memeriksa apakah metode permintaan yang benar telah digunakan. Saya telah melewatkan kode untuk melakukan itu, untuk terus fokus pada kode khusus JWT

{
    "alg": "HS256",
    "typ": "JWT"
}
_1

Kemudian, kode akan mencoba mengekstrak token dari header Bearer. Saya telah melakukannya menggunakan preg_match. Jika Anda tidak terbiasa dengan fungsinya, fungsi tersebut akan melakukan pencocokan ekspresi reguler pada sebuah string

Ekspresi reguler yang saya gunakan di sini akan mencoba mengekstrak token dari header Bearer, dan membuang yang lainnya. Jika tidak ditemukan, HTTP 400 Bad Request dikembalikan

{
    "alg": "HS256",
    "typ": "JWT"
}
_2

Perhatikan bahwa, secara default, Apache tidak akan meneruskan header

Authorization: Bearer ab0dde18155a43ee83edba4a4542b973
5 ke PHP. Alasan di balik ini adalah

Header otorisasi dasar hanya aman jika koneksi Anda dilakukan melalui HTTPS, karena jika tidak, kredensial dikirim dalam teks biasa yang disandikan (tidak dienkripsi) melalui jaringan yang merupakan masalah keamanan yang sangat besar

Saya sangat menghargai logika keputusan ini. Namun, untuk menghindari banyak kebingungan, tambahkan berikut ini ke konfigurasi Apache Anda. Maka kode akan berfungsi seperti yang diharapkan. Jika Anda menggunakan NGINX, kode seharusnya berfungsi seperti yang diharapkan

{
    "alg": "HS256",
    "typ": "JWT"
}
_3

Selanjutnya, kami mencoba mengekstrak JWT yang cocok, yang akan berada di elemen kedua dari variabel

Authorization: Bearer ab0dde18155a43ee83edba4a4542b973
6. Jika tidak tersedia, maka tidak ada JWT yang diekstraksi, dan HTTP 400 Bad Request dikembalikan

{
    "alg": "HS256",
    "typ": "JWT"
}
_4

Jika kita sampai pada titik ini, JWT telah diekstraksi, jadi kita beralih ke tahap decoding dan validasi. Untuk melakukan itu, kita memerlukan kunci rahasia kita lagi, yang akan diambil dari lingkungan atau konfigurasi aplikasi. Kami kemudian menggunakan metode statis

Authorization: Bearer ab0dde18155a43ee83edba4a4542b973
7 php-jwt, meneruskannya ke JWT, kunci rahasia, dan serangkaian algoritme yang akan digunakan untuk memecahkan kode JWT

Jika berhasil didekodekan, kami kemudian mencoba memvalidasinya. Contoh yang saya miliki di sini cukup sederhana, karena hanya menggunakan penerbit, bukan cap waktu sebelum dan kedaluwarsa. Dalam aplikasi nyata, Anda mungkin juga akan menggunakan sejumlah klaim lain

{
    "alg": "HS256",
    "typ": "JWT"
}
_5

Jika token tidak valid karena, misalnya, token telah kedaluwarsa, pengguna akan dikirimi header HTTP 401 Unauthorized, dan skrip akan keluar

Jika proses untuk mendekode JWT gagal, bisa jadi itu

  • Jumlah segmen yang disediakan tidak sesuai dengan standar tiga seperti yang dijelaskan sebelumnya
  • Header atau payload bukan string JSON yang valid
  • Tanda tangan tidak valid, yang berarti data telah dirusak
  • Klaim
    {
        "iat": 1416929109,
        "jti": "aa7f8d0a95c",
        "scopes": [
            "repo",
            "public_repo"
        ]
    }
    
    _0 diatur dalam JWT dengan stempel waktu saat stempel waktu saat ini kurang dari itu
  • Klaim
    {
        "alg": "HS256",
        "typ": "JWT"
    }
    
    7 diatur dalam JWT dengan stempel waktu saat stempel waktu saat ini kurang dari itu
  • Klaim
    {
        "iat": 1416929109,
        "jti": "aa7f8d0a95c",
        "scopes": [
            "repo",
            "public_repo"
        ]
    }
    
    _2 diatur dalam JWT dengan stempel waktu saat stempel waktu saat ini lebih dari itu

Seperti yang Anda lihat, JWT memiliki seperangkat kontrol yang bagus yang akan menandainya sebagai tidak valid, tanpa perlu mencabutnya secara manual atau memeriksanya dengan daftar token yang valid.

Jika proses decode dan validasi berhasil, pengguna akan diizinkan untuk membuat permintaan, dan akan dikirimkan respons yang sesuai

Kesimpulannya

Itulah pengenalan singkat tentang JSON Web Tokens, atau JWT, dan cara menggunakannya dalam aplikasi berbasis PHP. Mulai sekarang, Anda dapat mencoba mengimplementasikan JWT di API Anda berikutnya, mungkin mencoba beberapa algoritme penandatanganan lain yang menggunakan kunci asimetris seperti RS256, atau mengintegrasikannya ke server otentikasi OAUTH2 yang ada untuk menjadi kunci API

Jika Anda memiliki komentar atau pertanyaan, jangan ragu untuk menghubungi Twitter

Bagikan Artikel Ini

Otentikasi jwt membutuhkan firebase/php-jwt library drupal 8

Miguel Ibarra Romero

Pengembang aplikasi web, administrator basis data, pemimpin proyek di berbagai aplikasi perusahaan, dan sekarang penulis artikel. Tertarik dengan desain dan pengoptimalan basis data. Kagum dan terlibat dalam pengembangan sistem terdistribusi. Penggemar kriptografi dan keamanan informasi

Matius Setter

Matthew Setter adalah pengembang perangkat lunak, yang berspesialisasi dalam kode PHP yang andal, teruji, dan aman. Dia juga penulis Mezzio Essentials (https. //mezzio penting. com) pengantar komprehensif untuk mengembangkan aplikasi dengan Framework Mezzio PHP

Bagaimana cara menggunakan firebase JWT di PHP?

Mengamankan PHP RESTful API menggunakan Firebase JWT Library .
Langkah 1. Instal dan sertakan Firebase JWT(JSON WEB TOKEN) dalam proyek kami dengan mengikuti perintah komposer. .
Langkah 2. Buat sisi server JWT menggunakan metode enkode Perpustakaan Firebase Jwt di Login action , dan kembalikan ke Klien

Bagaimana cara menginstal perpustakaan JWT di PHP?

Pertama, mulai localhost Anda kemudian pergi ke direktori htdocs atau www, dan di sini buat folder baru bernama php-jwt. Setelah itu, Anda perlu mengunduh JWT di dalam folder ini untuk menggunakan JWT . Anda dapat mengkloning JWT dari Github atau mengunduhnya melalui Komposer.

Bagaimana cara menggunakan token JWT untuk otentikasi di PHP?

Gunakan JWT untuk Token Akses di PHP .
Ambil dan parsing Okta JSON Web Keys (JWK) Anda, yang harus diperiksa secara berkala dan di-cache oleh aplikasi Anda
Dekode token akses, yang dalam format Token Web JSON
Verifikasi tanda tangan yang digunakan untuk menandatangani token akses
Verifikasi klaim yang ditemukan di dalam token akses

Bagaimana cara menggunakan firebase php JWT di laravel?

Verifikasi Firebase auth JWT dengan PHP Laravel .
Aliran keseluruhan. Aplikasi klien mengambil Firebase ID Token (JWT) dan mengirimkannya ke server backend melalui header HTTP Otorisasi. .
TL;DR. .
Instal paket firebase/php-jwt. .
kelas FirebaseToken. .
Ambil kunci publik untuk memverifikasi JWT. .
Dekode dan verifikasi JWT. .
Mari kita gunakan