Kimlik doğrulama ve yetkilendirme

Bu bölümde, Fleet Engine uygulamasına bağlı olarak kimlik doğrulama ve yetkilendirme kavramları açıklanmaktadır. Fleet Engine işlev çağrılarınızı güvence altına almak için gerçekleştirmeniz gereken prosedürlerle ilgili ayrıntılı bilgi verir.

Last Mile Fleet Solution tarafından sağlanan özellikleri, Google Cloud Console aracılığıyla yapılandırabilirsiniz. Bu API'ler ve SDK'lar, Cloud Console'dan oluşturulan hizmet hesapları kullanılarak imzalanmış JSON Web Jetonlarının (JWT) kullanılmasını gerektirir.

Genel bakış

Fleet Engine, yetkilendirme mekanizmasının bir parçası olarak düşük güven düzeyine sahip ortamlardan gelen çağrılardan ekstra güvenlik sağlar. Düşük güven düzeyine sahip ortamlarda akıllı telefonlar ve tarayıcılar bulunur. Buna ek olarak Fleet Engine, bir çağrıya yalnızca görevini tamamlaması için gereken ayrıcalıkların verilmesi gereken En az ayrıcalık ilkesi'ni kullanır.

Düşük güven düzeyine sahip ortamlardan gelen işlev çağrılarını korumak için Google, kodunuzun tamamen güvenilir bir ortam olan arka uç sunucunuzda jeton oluşturduğu bir mekanizma tasarladı. Her çağrı, eksiksiz bir güvenlik açıklaması içerir. Daha sonra bu açıklama, herhangi bir ortamdan yapılan aramayla birlikte iletebileceğiniz bir JWT'ye dönüştürülür.

Kimlik doğrulama tasarımı ilkeleri

Fleet Engine'in kimlik doğrulama akışı, aşağıdaki tasarım ilkelerini içerir.

  • IAM rolleri, arayan için izin verilen etkinlik kapsamını tanımlar. Örneğin, SuperUser rolünün her şeyi yapmasına izin verilirken SuperUser rolünün yalnızca minimum düzeyde konum güncellemesi yapmasına izin verilir.

  • IAM rolleri, hizmet hesaplarıyla ilişkilidir.

  • JWT iddiaları, arayanın üzerinde çalışabileceği tüzel kişileri daha da kısıtlar. Bunlar belirli görevler veya teslimat araçları olabilir.

  • Fleet Engine'e gönderilen istekler her zaman bir JWT içerir.

    • JWT'ler hizmet hesaplarıyla ilişkilendirildiğinden, Fleet Engine'e gönderilen istekler dolaylı olarak JWT ile ilişkilendirilmiş hizmet hesabıyla ilişkilendirilir.
  • Fleet Engine'e iletebileceğiniz uygun JWT'yi istemek için düşük güven düzeyine sahip bir ortamda çalışan kodunuzun öncelikle tamamen güvenilir bir ortamda çalışan kodunuzu çağırması gerekir.

  • Fleet Engine, aşağıdaki güvenlik kontrollerini gerçekleştirir:

    1. Hizmet hesabıyla ilişkili IAM rolleri, çağrıyı yapanın API çağrısında bulunabilmesi için doğru yetkilendirmeyi sağlar.

    2. İstekte iletilen JWT iddiaları, çağrıyı yapan kişinin varlık üzerinde faaliyet göstermesi için doğru yetkilendirmeyi 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ı oluşturur.

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

  3. Filo yöneticisi, arka ucunu hizmet hesaplarıyla yapılandırır.

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

  5. Fleet Engine, ilgili hizmet hesabı için bir JWT yayınlar. JWT'yi istemci uygulaması 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 ayarlamak için önce projenizi, ardından hizmet hesaplarını oluşturun.

Google Cloud projenizi oluşturmak için:

  1. Google Cloud Console'u kullanarak Google Cloud projesi oluşturun.
  2. API'ler ve Hizmetler Kontrol Paneli'ni kullanarak Yerel Yolculuklar ve Teslimatlar 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, role bağlı olarak farklı izin grupları veren JWT'leri basmak için bir hizmet hesabı kullanılır. Kötüye kullanım olasılığını azaltmak için her biri gerekli minimum rol kümesine sahip birden fazla hizmet hesabı oluşturabilirsiniz.

Last Mile Fleet Solution, aşağıdaki 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 veya 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, görev bilgilerini okuma ve güncelleme izni verir. Bu role sahip bir hizmet hesabı tarafından basılan jetonlar genellikle teslimat yapan tüketicinin web tarayıcısından kullanılır.
Fleet Engine Delivery Süper Kullanıcısı

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 Delivery Fleet Okuyucu

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 cihazlarla kazandıran 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ün güvenliğini 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üşterinin arka uç sunucularından kaynaklanmalıdır.

Sürücü ve Tüketici SDK'ları, bu standart rollere uygun şekilde oluşturulmuştur. Bununla birlikte, rastgele bir izin grubunun bir araya getirilmesine 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ı kesinlikle öneririz.

Hizmet Hesabı Oluşturma

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

Güvenilmeyen istemciler için JWT uygulamanız gerekiyorsa kolaylık olması açısından, kullanıcıları Hizmet Hesabı Jetonu Oluşturucu Rolü'ne eklemek, gcloud komut satırı araçlarıyla jeton oluşturmalarına olanak tanır.

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 Yetkilendirme Kitaplığı

Fleet Engine, Fleet Engine API'lerine erişimi kısıtlamak için JWT'leri kullanır. GitHub'da bulunan yeni Fleet Engine Yetkilendirme 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 (hizmet hesabının kimliğine bürünme gibi) jeton imzalama mekanizmaları sağlar.
  • gRPC saplaması veya GAPIC istemcisinden yapılan giden isteklere imzalı jeton ekler.

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

Fleet Engine Yetkilendirme Kitaplığı kullanılmadığında JWT'lerin doğrudan kod tabanınız içinde oluşturulması gerekir. Bunun için hem JWT'leri iyice anlamanız, hem de bunların Fleet Engine ile ilişkisini iyi bilmeniz gerekir. Bu nedenle Fleet Engine Yetkilendirme 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 alınır) ve şifreleme algoritması gibi bilgiler yer alır. Talep bölümünde jetonun oluşturulma zamanı, jetonun geçerlilik süresi, jetonun erişim talep ettiği hizmetler ve erişimi daraltmak için diğer yetkilendirme bilgileri (ör. teslimat aracı kimliği) yer alır.

Bir JWT başlık 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ındaki anahtarı kullandığınızdan emin olun.

JWT 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.
kitle Hizmet hesabınızın SERVICE_NAME adresi (bu örnekte https://fleetengine.googleapis.com/)
Iat Jetonun oluşturulduğu zaman damgası. 1 Ocak 1970 tarihinde 00:00:00 (UTC) itibarıyla geçen saniye cinsinden belirtilir. Eğme için 10 dakika bekleyin. Zaman damgası çok eski veya ilerideyse sunucu bir hata bildirebilir.
exp Jetonun süresinin dolacağı zaman damgası. 1 Ocak 1970 tarihinde 00:00:00 UTC tarihinden bu yana geçen saniye cinsinden belirtilir. Zaman damgası gelecekte bir saatten uzunsa istek başarısız olur.
authorization Kullanım alanına bağlı olarak "deliveryvehicleid", "trackingid", "taskid" veya "taskid"ler içerebilir.

JWT jetonu basılması, jetonun imzalanması anlamına gelir. JWT'yi oluşturma ve imzalamayla ilgili talimatlar ve kod örnekleri için OAuth olmadan hizmet hesabı yetkilendirmesi sayfasına göz atın. Ardından gRPC çağrılarına veya Fleet Engine'e erişmek için kullanılan diğer yöntemlere basılmış jeton ekleyebilirsiniz.

JWT Hak Talepleri

Last Mile Fleet Solution, gizli hak talepleri kullanır. Gizli hak talebi kullanılması, yalnızca yetkili müşterilerin kendi verilerine erişebilmesini sağlar. Örneğin, arka ucunuz bir teslimat sürücüsü mobil cihazı için bir JSON Web Jetonu yayınladığında bu jeton, sürücünün teslimat aracı kimliğinin değerini içeren deliveryvehicleid talebini içermelidir. Ardından, sürücü rolüne bağlı olarak jetonlar, rastgele başka bir araç kimliği için değil, yalnızca ilgili teslimat yapılan araç kimliği için erişim sağlar.

Last Mile Fleet Solution, aşağıdaki özel hak taleplerini kullanır:

  • deliveryvehicleid: Araç başına API'leri çağırırken kullanın.
  • taskid - Görev başına API'leri çağırırken kullanın.
  • taskids - BatchCreateTasksAPI çağrılırken kullan. 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 - SearchTasksAPI çağrılırken kullanın. Hak talebinin, istekteki izleme kimliğiyle eşleşmesi gerekir. delivervehicleid, taskid veya taskids hak taleplerini dahil etmeyin.

Arka uç sunucunuzdan API çağırırken jeton da uygun talebi içermelidir. Ancak deliveryvehicleid, taskid ve trackingid talepleri için özel bir yıldız işareti ("*") 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ı kullanmak yerine doğrudan jeton hamuru olarak bir JSON oluşturmak ve imzalamak istiyorsanız Identity Developer belgelerindeki OAuth olmadan hizmet hesabı yetkilendirmesi ile ilgili talimatları okuyun.

Jetonu bir gRPC çağrısına ekleme mekanizması, çağrıyı yapmak için kullanılan dile ve çerçeveye bağlıdır. HTTP çağrısı için jeton belirtme mekanizması, tekil gönderim takibi veya filo performansı kullanım alanları için yetkilendirme notlarında belirtildiği gibi, değeri jeton olan bir hamiline ait jetona sahip bir Yetkilendirme başlığı eklemektir.

Aşağıdaki örnekte, arka uç sunucunuzdaki bir görev başına 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ç sunucunuzdan 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 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": {
         "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/ adresini belirtin.
  • iat alanı için jetonun oluşturulduğu zaman damgasını (1 Ocak 1970, 00:00:00 UTC saatinden itibaren geçen saniye cinsinden) belirtin. Eğme için 10 dakika bekleyin. Zaman damgası çok eski veya ilerideyse sunucu bir hata bildirebilir.
  • exp alanı için jetonun süresinin dolacağı zamanı, 1 Ocak 1970 tarihinde 00:00:00 UTC saat diliminden itibaren saniye cinsinden belirtin. Önerilen değer iat + 3.600'dür.

Mobil cihaza veya son kullanıcıya iletilecek jetonu imzalarken Teslimat Sürücüsü ya da Tüketici rolü için kimlik bilgisi dosyasını kullandığınızdan emin olun. Aksi takdirde, mobil cihaz veya son kullanıcı, erişmemeleri gereken bilgileri değiştirme veya görüntüleme olanağına sahip olur.