Kimlik doğrulama ve yetkilendirme

Bu bölümde, Fleet Engine ile entegrasyon bakımından kimlik doğrulama ve yetkilendirme kavramları açıklanmaktadır.

Last Mile Fleet Solution'ın sağladığı özellikleri Google Cloud Console üzerinden yapılandırabilirsiniz. Fleet Engine SDK'ları, uygun bir Hizmet Hesabı tarafından imzalanmış JSON Web Jetonlarının (JWT) kullanılmasını gerektirir.

Genel bakış

Fleet Engine'e karşı kimlik doğrulama ve yetkilendirme yapan müşteri arka uçları, standart Uygulama Varsayılan Kimlik Bilgileri mekanizmalarını kullanmalıdır.

Fleet Engine, akıllı telefonlar ve tarayıcılar gibi güveni düşük ortamlardan gelen aramaları da alır. Hizmet Hesabı gizli anahtarlarını yalnızca güvenilir ortamlara uygun olan korumak amacıyla, müşterilerin arka uçlarının Fleet Engine'e özel ek iddialar içeren imzalı JSON Web Jetonları (JWT) oluşturması beklenir. Bu bilgiler, daha sonra cep telefonları gibi güvenilmeyen ortamlara verilebilir.

Kimlik doğrulama tasarım ilkeleri

Fleet Engine'in kimlik doğrulama akışında aşağıdaki tasarım ilkeleri kullanılır.

  • IAM rolleri, bir ana hesap için izin verilen kaynaklarda bir dizi izin tanımlar. Örneğin, Yönetici rollerinin Uygulama Varsayılan Kimlik Bilgileri ile her şeyi yapmasına izin verilirken, Güvenilmeyen Sürücü* rolünün yalnızca araç konumunu güncellemesine ve kimlik doğrulama ve yetkilendirme için JWT kullanımıyla sınırlıdır.

  • Güvenilir olmayan ortamlarda JWT iddiaları, arayanın üzerinde çalışabileceği varlıkları daha da kısıtlar. Bunlar belirli görevler veya teslimat araçları olabilir.

  • Düşük güven ortamında çalışan bir kodunuz, JWT yayınlamak için öncelikle güvenilir bir ortamda çalışan kodunuzu çağırmalıdır.

  • Fleet Engine, bir kaynak için API çağrılarında aşağıdaki güvenlik kontrollerini gerçekleştirir:

    1. Çağrı ana hesabı, kaynaktaki işlem için uygun izinlere (rol ataması aracılığıyla) sahiptir.

    2. Yönetici olmayan roller için istekte iletilen JWT talepleri, kaynak için gerekli izni sağlar.

Kimlik doğrulama akışı

Aşağıdaki sıra şemasında bu kimlik doğrulama akışı ayrıntıları gösterilmektedir.

  1. Filo yöneticisi, hizmet hesaplarını oluşturur.

  2. Filo yöneticisi, hizmet hesaplarına belirli IAM rollerini atar.

  3. Filo yöneticisi, arka uçlarını hizmet hesapları ve Uygulama Varsayılan Kimlik Bilgileri ile yapılandırır.

  4. İstemci uygulaması müşteri arka ucundan bir JWT ister. İstek sahibi; Sürücü uygulaması, Tüketici uygulaması veya bir izleme uygulaması olabilir.

  5. Müşteri arka ucu, ilgili hizmet hesabı için bir JWT imzalayıp düzenler. İstemci uygulaması JWT'yi alır.

  6. İstemci uygulaması, kurulum aşamasında kendisine atanan IAM rollerine bağlı olarak verileri okumak veya değiştirmek amacıyla Fleet Engine'e bağlanmak için JWT'yi kullanır.

Kimlik doğrulama sırası şeması

Bulut projesi kurulumu

Bulut projenizi kurmak için önce projenizi, ardından hizmet hesapları oluşturun.

Google Cloud projenizi oluşturmak için:

  1. Google Cloud Console'u kullanarak bir Google Cloud projesi oluşturun.
  2. API'ler ve Hizmetler Kontrol Paneli'ni kullanarak Local Rides and Deliveries API'sini etkinleştirin.

Hizmet Hesapları ve IAM Rolleri

Hizmet hesabı, bir kişi yerine bir uygulama tarafından kullanılan özel bir hesap türüdür. Genellikle bir hizmet hesabı, role bağlı olarak farklı izin setleri veren JWT'leri yazmak için kullanılır. Kötüye kullanım olasılığını azaltmak için her biri minimum rol kümesine (gerekli) sahip birden fazla hizmet hesabı oluşturabilirsiniz.

Last Mile Fleet Çözümü şu rolleri kullanır:

RolAçıklama
Fleet Engine Delivery Güvenilir Sürücü Kullanıcısı

roles/fleetengine.deliveryTrustedDriver
Teslimat aracının konumunu ve görev durumunu ya da sonucunu güncellemek de dahil olmak üzere teslimat araçlarını ve görevleri oluşturma ve güncelleme izni verir. Bu role sahip bir hizmet hesabı tarafından basılan jetonlar genellikle teslimat sürücünüzün mobil cihazlarından veya arka uç sunucularınızdan kullanılır.
Fleet Engine Delivery Güvenilmeyen Sürücü Kullanıcısı

roles/fleetengine.deliveryUntrustedDriver
Teslimat aracının konumunu güncelleme izni verir. Bu role sahip bir hizmet hesabı tarafından basılan jetonlar genellikle teslimat sürücünüzün mobil cihazlarından kullanılır.
Fleet Engine Delivery Tüketici Kullanıcısı

roles/fleetengine.deliveryConsumer
İzleme kimliği kullanarak görev arama ve görev bilgilerini okuma izni verir ancak güncellemez. Bu role sahip bir hizmet hesabı tarafından basılan jetonlar genellikle teslimat tüketicisinin web tarayıcısından kullanılır.
Fleet Engine Delivery Yöneticisi

roles/fleetengine.deliveryAdmin
Teslim kaynakları için okuma ve yazma izni verir. Bu role sahip ana hesapların JWT kullanmasına gerek yoktur, bunun yerine Uygulama Varsayılan Kimlik Bilgilerini kullanmalıdır. Özel JWT talepleri yoksayılır. Bu rol, güvenilir ortamlarla (müşteri arka ucu) sınırlı olmalıdır.
Fleet Engine Delivery Süper Kullanıcısı **(KULLANIMDAN KALDIRILDI)**

roles/fleetengine.deliverySuperUser
Tüm teslimat araçlarına ve görev API'lerine izin verir. Bu role sahip bir hizmet hesabı tarafından basılan jetonlar genellikle arka uç sunucularınızdan kullanılır.
Fleet Engine Teslim Filosu Okuyucusu

roles/fleetengine.deliveryFleetReader
Teslimat araçlarını ve görevleri okuma ve izleme kimliği kullanarak görev arama izni verir. Bu role sahip bir hizmet hesabı tarafından basılan jetonlar genellikle teslimat filosu operatörünün web tarayıcısından kullanılır.

Teslimat sürücülerine kurumsal BT tarafından yönetilen cihazlar sağlayan kuruluşlar, Fleet Engine Güvenilir Sürücü Kullanıcısı rolünün sunduğu esneklikten yararlanabilir ve Fleet Engine etkileşimlerinin bir kısmını veya tamamını mobil uygulamaya entegre etmeyi seçebilir.

Kendi Cihazını Getir politikalarını destekleyen kuruluşlar Fleet Engine Güvenilmeyen Sürücü Kullanıcısı rolünü tercih etmeli ve araç konumu güncellemelerini Fleet Engine'e göndermek için yalnızca mobil uygulamayı kullanmalıdır. Diğer tüm etkileşimler müşteri arka uç sunucularından yapılmalıdır.

Sürücü ve Tüketici SDK'ları bu standart roller temel alınarak oluşturulmuştur. Bununla birlikte, rastgele bir izin grubunun birlikte gruplandırılmasına olanak tanıyan özel roller oluşturmak mümkündür. Sürücü ve Tüketici SDK'ları, gerekli bir izin eksik olduğunda hata mesajları gösterir. Sonuç olarak, özel roller yerine yukarıda sunulan standart rol grubunu kullanmanızı önemle tavsiye ederiz.

Hizmet Hesabı oluşturma

Google Cloud Console'daki IAM & Admin > Service Accounts sekmesini kullanarak hizmet hesabı oluşturabilirsiniz. Rol açılır listesinden Fleet Engine'i seçin ve rollerden birini hizmet hesabına atayın. Her bir rolle ilişkili hesabı belirtmek doğru bir uygulamadır. Örneğin, hizmet hesabına anlamlı bir ad verin.

Güvenilmeyen istemciler için JWT'leri basmanız gerekiyorsa kullanıcıları Hizmet Hesabı Jetonu Oluşturucu rolüne ekleyerek gcloud komut satırı araçlarıyla jeton oluşturabilirsiniz.

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

Burada my-user@example.com, gcloud (gcloud auth list --format='value(account)') ile kimlik doğrulamak için kullanılan e-posta adresidir.

Fleet Engine Kimlik Doğrulama Kitaplığı

Fleet Engine, güvenilir olmayan ortamlarda Fleet Engine API'lerine erişimi kısıtlamak için JWT'leri kullanır. GitHub'da bulunan Fleet Engine Auth Kitaplığı, Fleet Engine JWT'lerinin oluşturulmasını basitleştirir ve bunları güvenli bir şekilde imzalar.

Kitaplık aşağıdaki avantajları sunar:

  • Fleet Engine Jetonları oluşturma işlemini basitleştirir.
  • Kimlik bilgisi dosyalarını kullanmak dışında jeton imzalama mekanizmaları sağlar (bir hizmet hesabının kimliğine bürünme gibi).

Yetkilendirme için JSON Web Token (JWT) oluşturma

Fleet Engine Kimlik Doğrulama Kitaplığı kullanılmadığında, JWT'lerin doğrudan kod tabanınızda oluşturulması gerekir. Bunun için hem JWT'leri hem de Fleet Engine'le olan ilişkilerini iyice kavramanız gerekir. Bu nedenle, Fleet Engine Auth Kitaplığı'ndan yararlanmanızı ÖNEMLE tavsiye ederiz.

Fleet Engine'de JWT'ler kısa ömürlü kimlik doğrulama sağlar ve cihazların yalnızca yetkilendirildikleri araçları veya görevleri değiştirebilmesini sağlar. JWT'ler bir başlık ve hak talebi bölümü içerir. Başlık bölümünde, kullanılacak özel anahtar (hizmet hesaplarından elde edilir) ve şifreleme algoritması gibi bilgiler yer alır. Talep bölümü; jetonun oluşturulma zamanı, jetonun geçerlilik süresi, jetonun erişim talep ettiği hizmetler ve erişimi kapsamını daraltmak için kullanılan diğer yetkilendirme bilgileri (ör. teslimat aracının kimliği) gibi bilgileri içerir.

JWT başlığı bölümü aşağıdaki alanları içerir:

AlanAçıklama
alg Kullanılacak algoritma. "RS256".
typ Jetonun türü. "JWT".
çocuk Hizmet hesabınızın özel anahtar kimliği. Bu değeri, hizmet hesabı JSON dosyanızın "private_key_id" alanında bulabilirsiniz. Doğru izin düzeyine sahip bir hizmet hesabından anahtar kullandığınızdan emin olun.

JWT hak talepleri bölümü aşağıdaki alanları içerir:

AlanAçıklama
iss Hizmet hesabınızın e-posta adresi.
sub Hizmet hesabınızın e-posta adresi.
Aud Hizmet hesabınızın SERVICE_NAME hizmeti (bu örnekte https://fleetengine.googleapis.com/)
iat Jetonun oluşturulduğu anı belirten zaman damgası (1 Ocak 1970'te 00:00:00 (UTC) tarihinden itibaren geçen saniye cinsinden belirtilir. Eğiklik için 10 dakika bekleyin. Zaman damgası çok geçmişte veya gelecekteyse sunucu bir hata bildirebilir.
exp Jetonun süresinin dolmasına kalan zaman damgası (1 Ocak 1970 00:00:00 UTC itibarıyla geçen saniye cinsinden belirtilir). Zaman damgası gelecekte bir saatten daha ilerideyse istek başarısız olur.
authorization Kullanım alanına bağlı olarak "deliveryvehicleid", "trackingid", "taskid" veya "taskids" içerebilir.

JWT jetonunu bastırmak, jetonu imzalama anlamına gelir. JWT'yi oluşturma ve imzalamayla ilgili talimatlar ve kod örnekleri için OAuth olmadan hizmet hesabını yetkilendirme başlıklı makaleyi inceleyin. Ardından, basılmış bir jetonu gRPC çağrılarına veya Fleet Engine'e erişmek için kullanılan diğer yöntemlere ekleyebilirsiniz.

JWT Hak Talepleri

Last Mile Fleet Solution, gizli hak taleplerini kullanır. Gizli hak taleplerini kullanmak, kendi verilerine yalnızca yetkili istemcilerin erişebilmesini sağlar. Örneğin, arka ucunuz teslimat sürücüsünün mobil cihazı için bir JSON Web Jetonu yayınladığında bu jeton, sürücünün teslimat aracı kimliğinin değeriyle birlikte deliveryvehicleid talebini içermelidir. Ardından jetonlar, sürücü rolüne bağlı olarak yalnızca belirli bir araç kimliği için erişim sağlar. Başka rastgele araç kimlikleri için erişim sağlamaz.

Last Mile Fleet Solution, aşağıdaki gizli iddiaları kullanır:

  • deliveryvehicleid: Teslimat başına araç başına API'leri çağırırken kullanın.
  • taskid - görev başına API'leri çağırırken kullanın.
  • taskids - BatchCreateTasksAPI aranırken kullanın. Bu iddia, dizi biçiminde olmalı ve dizi, isteği tamamlamak için gereken tüm görev kimliklerini içermelidir. delivervehicleid, trackingid veya taskid hak taleplerini dahil etmeyin.
  • trackingid - GetTaskTrackingInfoAPI çağrılırken kullanın. Hak talebi, istekteki izleme kimliğiyle eşleşmelidir. delivervehicleid, taskid veya taskids hak taleplerini dahil etmeyin.

Jeton, arka uç sunucunuzdan API'leri çağırırken uygun talebi de içermelidir. Ancak deliveryvehicleid, taskid ve trackingid talepleri için yıldız işareti ("*") özel değerini kullanabilirsiniz. Yıldız işareti ("*"), taskids talebinde de kullanılabilir ancak dizideki tek öğe olmalıdır.

OAuth 2.0 erişim jetonlarını kullanmak yerine doğrudan jeton sahibi olarak bir JSON oluşturmak ve imzalamak isterseniz Identity Developer belgelerindeki OAuth olmadan hizmet hesabını yetkilendirme talimatlarını okuyun.

Jetonu gRPC çağrısına ekleme mekanizması, çağrıyı yapmak için kullanılan dile ve çerçeveye bağlıdır. Bir HTTP çağrısına jeton belirtme mekanizması, bireysel gönderim izleme veya filo performansı kullanım alanlarına yönelik yetkilendirme notlarında belirtildiği gibi, hamiline ait jeton (bu jeton) olan bir Yetkilendirme başlığı eklemektir.

Aşağıdaki örnekte arka uç sunucunuzdaki görev başına bir işlem için bir jeton gösterilmektedir:

    {
      "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": "*"
       }
    }

Aşağıdaki örnekte, arka uç sunucunuzdaki bir toplu görev oluşturma işlemi için bir jeton gösterilmektedir:

    {
      "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": ["*"]
       }
    }

Aşağıdaki örnekte, arka uç sunucunuzdan gelen araç başına teslim işlemi için bir jeton gösterilmektedir:

    {
      "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": "*"
       }
    }

Aşağıdaki örnekte son kullanıcı müşteriler için bir jeton gösterilmektedir:

    {
      "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"
       }
    }

Aşağıdaki örnekte sürücü uygulamanız için bir jeton gösterilmektedir:

    {
      "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"
       }
    }
  • Başlıktaki kid alanı için hizmet hesabınızın özel anahtar kimliğini belirtin. Bu değeri, hizmet hesabı JSON dosyanızın private_key_id alanında bulabilirsiniz.
  • iss ve sub alanları için hizmet hesabınızın e-posta adresini belirtin. Bu değeri, hizmet hesabı JSON dosyanızın client_email alanında bulabilirsiniz.
  • aud alanı için https://SERVICE_NAME/ değerini belirtin.
  • iat alanı için jetonun oluşturulduğu anı zaman damgasını (1 Ocak 1970 00:00:00 (UTC) tarihinden itibaren geçen saniye cinsinden) belirtin. Eğiklik için 10 dakika bekleyin. Zaman damgası çok geçmişte veya gelecekteyse sunucu bir hata bildirebilir.
  • exp alanı için jetonun süresinin dolacağı zaman damgasını (1 Ocak 1970 00:00:00 (UTC) tarihinden itibaren saniye cinsinden) belirtin. Önerilen değer iat + 3.600'dür.

Bir mobil cihaza veya son kullanıcıya iletilecek jetonu imzalarken, Teslim Sürücüsü veya Tüketici rolü için kimlik bilgisi dosyasını kullandığınızdan emin olun. Aksi takdirde, mobil cihaz veya son kullanıcı, erişememesi gereken bilgileri değiştirebilir veya görüntüleyebilir.