Autentikasi dan otorisasi

Bagian ini menjelaskan konsep otentikasi dan otorisasi dengan sehubungan dengan integrasi dengan Fleet Engine.

Anda dapat mengonfigurasi kemampuan yang disediakan oleh Last Mile Fleet Solution melalui Konsol Google Cloud. SDK Fleet Engine mewajibkan penggunaan Token Web JSON (JWT) yang telah ditandatangani Layanan yang sesuai Akun.

Ringkasan

Backend pelanggan yang mengautentikasi dan memberi otorisasi terhadap Fleet Engine harus menggunakan standar Default Aplikasi Kredensial mekanisme atensi.

Fleet Engine juga menerima panggilan yang berasal dari lingkungan dengan tingkat kepercayaan rendah seperti smartphone dan browser. Untuk mengamankan kunci rahasia Akun Layanan saja cocok untuk lingkungan tepercaya, lingkungan pelanggan backend diharapkan menghasilkan Token Web JSON (JWT) yang ditandatangani dengan klaim tambahan khusus untuk Fleet Engine yang kemudian dapat dikeluarkan ke lingkungan yang tidak terpercaya seperti ponsel.

Prinsip desain autentikasi

Alur otentikasi Fleet Engine menggabungkan prinsip-prinsip desain berikut.

  • Peran IAM menentukan sekumpulan izin pada resource yang diizinkan untuk akun utama. Misalnya, Peran Admin diizinkan untuk melakukan apa pun dengan Default Aplikasi Kredensial, sedangkan peran {i>Untrusted Driver<i}* hanya diizinkan untuk diperbarui lokasi kendaraan dan dibatasi oleh penggunaan JWT untuk otentikasi dan otorisasi.

  • Untuk lingkungan yang tidak tepercaya, klaim JWT membatasi lebih lanjut entitas yang pemanggil dapat beroperasi. Tugas ini bisa berupa tugas atau kendaraan pengiriman.

  • Kode Anda yang berjalan di lingkungan low-trust harus terlebih dahulu memanggil kode yang berjalan di lingkungan yang terpercaya untuk mengeluarkan JWT.

  • Fleet Engine melakukan pemeriksaan keamanan berikut pada panggilan API untuk referensi:

    1. Akun utama yang memanggil memiliki izin yang sesuai (melalui peran ) untuk tindakan pada resource.

    2. Untuk peran non-Admin, klaim JWT diteruskan dalam permintaan, izin akses yang diperlukan untuk resource tersebut.

Alur autentikasi

Diagram urutan berikut menunjukkan detail alur autentikasi ini.

  1. Administrator fleet membuat akun layanan.

  2. Administrator fleet menetapkan peran IAM tertentu ke akun layanan.

  3. Administrator fleet mengonfigurasi backend mereka dengan akun layanan dan Kredensial Default Aplikasi.

  4. Aplikasi klien meminta JWT dari backend pelanggan. Pemohon dapat aplikasi Pengemudi, aplikasi Konsumen, atau aplikasi pemantauan.

  5. Backend pelanggan menandatangani dan menerbitkan JWT untuk layanan masing-masing menggunakan akun layanan. Aplikasi klien menerima JWT.

  6. Aplikasi klien menggunakan JWT untuk terhubung ke Fleet Engine untuk membaca atau mengubah data, tergantung pada peran IAM yang ditetapkan untuknya selama fase penyiapan.

Diagram urutan autentikasi

Penyiapan project cloud

Untuk menyiapkan project cloud, buat project terlebih dahulu, lalu membuat akun layanan.

Untuk membuat project Google Cloud:

  1. Membuat Project Google Cloud menggunakan Konsol Google Cloud.
  2. Dengan menggunakan Dashboard APIs and Services, aktifkan Local Rides and Deliveries API.

Akun Layanan & Peran IAM

Akun layanan adalah jenis akun khusus yang digunakan oleh aplikasi, bukan seseorang. Biasanya, akun layanan digunakan untuk membuat JWT yang memberikan izin yang bergantung pada perannya. Untuk mengurangi kemungkinan penyalahgunaan Anda dapat membuat beberapa akun layanan, masing-masing dengan kumpulan peran minimum wajib ().

Last Mile Fleet Solution menggunakan peran berikut:

PeranDeskripsi
Pengguna Pengemudi Tepercaya Pengiriman Fleet Engine

roles/fleetengine.deliveryTrustedDriver
Memberikan izin untuk membuat dan memperbarui kendaraan dan tugas pengiriman, termasuk memperbarui lokasi kendaraan pengiriman dan status tugas atau hasil proyek. Token yang dibuat oleh akun layanan dengan peran ini biasanya digunakan dari perangkat seluler pengemudi pengiriman Anda atau dari server backend Anda.
Pengguna Pengemudi Tidak Tepercaya Pengiriman Fleet Engine

roles/fleetengine.deliveryUntrustedDriver
Memberikan izin untuk memperbarui lokasi kendaraan pengiriman. Token yang dibuat oleh akun layanan dengan peran ini biasanya digunakan dari pengiriman perangkat seluler pengemudi.
Pengguna Konsumen Pengiriman Fleet Engine

roles/fleetengine.deliveryConsumer
Memberikan izin untuk menelusuri tugas menggunakan ID pelacakan, dan membaca tetapi tidak memperbarui informasi tugas. Token yang dibuat oleh akun layanan dengan peran ini biasanya digunakan dari pengiriman browser web konsumen.
Admin Pengiriman Fleet Engine

roles/fleetengine.deliveryAdmin
Memberikan izin baca dan tulis untuk resource pengiriman. Kepala sekolah dengan peran ini tidak perlu menggunakan JWT dan harus menggunakan {i>Application<i} Kredensial Default. Klaim JWT kustom akan diabaikan. Peran ini harus dibatasi untuk lingkungan tepercaya (backend pelanggan).
Fleet Engine Delivery Super User **(TIDAK DIGUNAKAN LAGI)**

roles/fleetengine.deliverySuperUser
Memberikan izin ke semua API tugas dan kendaraan pengiriman. Token yang dibuat oleh akun layanan dengan peran ini biasanya digunakan dari backend Anda server web.
Pembaca Armada Pengiriman Fleet Engine

roles/fleetengine.deliveryFleetReader
Memberikan izin untuk membaca tugas dan kendaraan pengiriman serta mencari tugas menggunakan ID pelacakan. Token yang dibuat oleh akun layanan dengan metode ini yang biasanya digunakan dari browser web operator armada pengiriman.

Organisasi yang melengkapi pengemudi pengiriman mereka dengan perangkat yang dikelola oleh IT perusahaan dapat memanfaatkan fleksibilitas yang ditawarkan oleh Fleet Engine Peran Pengguna Pengemudi Tepercaya dan memilih untuk mengintegrasikan beberapa atau semua Fleet Engine interaksi di aplikasi seluler.

Organisasi yang mendukung kebijakan Bawa Perangkat Sendiri harus memilih untuk mengikuti keamanan peran Fleet Engine Untrusted Driver User dan hanya mengandalkan untuk mengirim pembaruan lokasi kendaraan ke Fleet Engine. Lainnya harus berasal dari server backend pelanggan.

Driver dan Consumer SDK dibuat berdasarkan peran standar ini. Namun, Anda dapat membuat peran khusus yang memungkinkan serangkaian izin akses yang berubah-ubah untuk digabungkan. Driver dan Consumer SDK akan menampilkan pesan error izin yang diperlukan tidak ada. Oleh karena itu, kami sangat merekomendasikan menggunakan kumpulan peran standar yang ditampilkan di atas, bukan peran khusus.

Membuat Akun Layanan

Anda dapat membuat akun layanan menggunakan IAM & Admin > Service Accounts tab di Konsol Google Cloud. Dari menu drop-down Peran, pilih Fleet Engine dan tetapkan salah satu peran ke akun layanan. Bagus untuk menunjukkan akun yang terkait dengan setiap peran. Misalnya, beri akun layanan nama yang bermakna.

Demi kemudahan, jika Anda perlu membuat JWT untuk klien yang tidak tepercaya, tambahkan peran Service Account Token Creator memungkinkan mereka membuat token dengan alat command line gcloud.

gcloud projects add-iam-policy-binding project-id \
       --member=user:my-user@example.com \
       --role=roles/iam.serviceAccountTokenCreator

Dengan my-user@example.com adalah email yang digunakan untuk melakukan autentikasi dengan gcloud (gcloud auth list --format='value(account)').

Library Auth Fleet Engine

Fleet Engine menggunakan JWT untuk membatasi akses ke Fleet Engine API secara tidak tepercaya lingkungan fleksibel App Engine. Library Auth Fleet Engine, tersedia di GitHub, menyederhanakan pembangunan JWT Fleet Engine dan menandatanganinya dengan aman.

Library ini memberikan manfaat berikut:

  • Menyederhanakan proses pembuatan Token Fleet Engine.
  • Menyediakan mekanisme penandatanganan token selain menggunakan file kredensial (seperti meniru akun layanan).

Membuat Token Web JSON (JWT) untuk otorisasi

Jika tidak menggunakan Library Auth Fleet Engine, JWT harus dibuat langsung dalam codebase Anda. Hal ini mengharuskan Anda untuk memiliki memahami JWT dan hubungannya dengan Fleet Engine. Inilah alasan mengapa kita Sangat direkomendasikan untuk memanfaatkan Library Auth Fleet Engine.

Di dalam Fleet Engine, JWT menyediakan autentikasi jangka pendek dan memastikan bahwa perangkat hanya dapat memodifikasi kendaraan atau tugas untuk mereka diberi otorisasi. JWT berisi header dan bagian klaim. Bagian {i>header<i} berisi informasi seperti kunci pribadi yang digunakan (diperoleh dari akun layanan) dan enkripsi algoritme. Bagian klaim berisi informasi seperti waktu pembuatan token, waktu aktif token, layanan tempat token mengklaim akses ke, dan informasi otorisasi lainnya untuk cakupan di akses; misalnya, ID kendaraan pengiriman.

Bagian header JWT berisi kolom-kolom berikut:

KolomDeskripsi
alg Algoritma yang akan digunakan. `RS256`.
typ Jenis token. `JWT`.
kid ID kunci pribadi akun layanan Anda. Anda dapat menemukan nilai ini di kolom `private_key_id` pada file JSON akun layanan Anda. Pastikan untuk menggunakan kunci dari akun layanan dengan tingkat izin yang benar.

Bagian klaim JWT berisi kolom-kolom berikut:

KolomDeskripsi
iss Alamat email akun layanan Anda.
sub Alamat email akun layanan Anda.
aud SERVICE_NAME akun layanan Anda, dalam hal ini https://fleetengine.googleapis.com/
iat Stempel waktu saat token dibuat, ditentukan dalam detik berlalu sejak 00:00:00 UTC, 1 Januari 1970. Tunggu 10 menit untuk kemiringan. Jika stempel waktu terlalu lama, atau di masa mendatang, server mungkin melaporkan error.
exp Stempel waktu saat token berakhir, ditentukan dalam detik berlalu sejak 00:00:00 UTC, 1 Januari 1970. Permintaan akan gagal jika stempel waktu lebih dari satu jam pada masa mendatang.
authorization Tergantung pada kasus penggunaannya, dapat berisi `deliveryvehicleid`, `trackingid`, `taskid`, atau `taskids`.

Membuat token JWT mengacu pada proses penandatanganannya. Untuk mendapatkan petunjuk dan contoh kode untuk membuat dan menandatangani JWT, lihat Otorisasi akun layanan tanpa OAuth. Anda kemudian dapat melampirkan token yang dibuat ke panggilan gRPC atau metode lain yang digunakan untuk mengakses Fleet Engine.

Klaim JWT

Last Mile Fleet Solution menggunakan klaim pribadi. Menggunakan klaim pribadi memastikan bahwa hanya klien yang diotorisasi dapat mengakses data mereka sendiri. Misalnya, saat backend Anda menerbitkan Token Web JSON untuk perangkat seluler pengemudi pengiriman, token tersebut harus berisi klaim deliveryvehicleid dengan nilai pengantaran pengemudi tersebut ID kendaraan. Kemudian, tergantung pada peran {i>driver<i}, token hanya mengaktifkan akses ID kendaraan pengiriman yang spesifik dan bukan ID kendaraan arbitrer lainnya.

Last Mile Fleet Solution menggunakan klaim pribadi berikut:

  • deliveryvehicleid - digunakan saat memanggil API per pengiriman kendaraan.
  • taskid - digunakan saat memanggil API per tugas.
  • taskids - gunakan saat memanggil BatchCreateTasksAPI. Klaim ini harus dalam bentuk array, dan array harus berisi semua ID tugas yang diperlukan untuk menyelesaikan permintaan. Jangan sertakan delivervehicleid, trackingid, atau taskid klaim.
  • trackingid - gunakan saat memanggil GetTaskTrackingInfoAPI. Klaim harus cocokkan dengan ID pelacakan dalam permintaan. Jangan sertakan delivervehicleid, taskid, atau taskids klaim.

Token juga harus berisi klaim yang sesuai saat Anda memanggil API dari server backend, tetapi Anda dapat menggunakan nilai khusus tanda bintang ("*") untuk klaim deliveryvehicleid, taskid, dan trackingid. Tanda bintang ("*") juga dapat digunakan dalam klaim taskids, tetapi harus menjadi satu-satunya elemen dalam array.

Jika Anda ingin membuat dan menandatangani JSON langsung sebagai pembawa token, bukan menggunakan token akses OAuth 2.0, baca petunjuk untuk Otorisasi akun layanan tanpa OAuth dalam dokumentasi Developer Identitas.

Mekanisme untuk melampirkan token ke panggilan gRPC bergantung pada bahasa dan kerangka kerja yang digunakan untuk melakukan panggilan. Mekanisme untuk menentukan ke panggilan HTTP adalah menyertakan header Otorisasi dengan token pembawa yang nilainya adalah token, seperti yang tercatat dalam catatan otorisasi untuk pelacakan pengiriman atau performa secara singkat kasus penggunaan.

Contoh berikut menunjukkan token untuk operasi per tugas dari server backend:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskid": "*"
       }
    }

Contoh berikut menunjukkan token untuk operasi pembuatan tugas batch dari server backend:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskids": ["*"]
       }
    }

Contoh berikut menampilkan token untuk operasi kendaraan per pengiriman dari server backend Anda:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "*"
       }
    }

Contoh berikut menunjukkan token untuk pelanggan pengguna akhir:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_consumer_service_account"
    }
    .
    {
      "iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "trackingid": "shipment_12345"
       }
    }

Contoh berikut menunjukkan token untuk aplikasi pengemudi Anda:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_driver_service_account"
    }
    .
    {
      "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
      "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "driver_12345"
       }
    }
  • Untuk kolom kid di header, tentukan kredensial pribadi akun layanan Anda ID kunci tertentu. Anda dapat menemukan nilai ini di kolom private_key_id pada file JSON akun layanan Anda.
  • Untuk kolom iss dan sub, tentukan alamat email akun layanan Anda. Anda dapat menemukan nilai ini di kolom client_email pada akun layanan Anda file JSON Anda.
  • Untuk kolom aud, tentukan https://SERVICE_NAME/.
  • Untuk kolom iat, tentukan stempel waktu saat token dibuat, dalam detik berlalu sejak 00:00:00 UTC, 1 Januari 1970. Tunggu 10 menit untuk kemiringan. Jika stempel waktu terlalu jauh di masa lalu, atau di masa mendatang, server mungkin melaporkan error.
  • Untuk kolom exp, tentukan stempel waktu saat token berakhir, dalam detik sejak 00:00:00 UTC, 1 Januari 1970. Nilai yang direkomendasikan adalah iat + 3600.

Saat menandatangani token untuk diteruskan ke perangkat seluler atau pengguna akhir, pastikan agar dapat menggunakan file kredensial untuk peran Delivery Driver atau Consumer. Jika tidak, perangkat seluler atau pengguna akhir akan memiliki kemampuan untuk mengubah atau melihat informasi yang seharusnya tidak dapat mereka akses.