Kimlik doğrulama ve yetkilendirme

Bu bölümde, Fleet Engine ile entegrasyona bağlı kimlik doğrulama ve yetkilendirme kavramları açıklanmaktadır.

Last Mile Fleet Solution tarafından sağlanan özellikleri, Google Cloud Console aracılığıyla 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'de kimlik doğrulaması 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 çağrılar da alır. Yalnızca güvenilir ortamlara uygun Hizmet Hesabı gizli anahtarlarını korumak için müşterilerin arka uçlarının, Fleet Engine'e özgü ek iddialarla imzalanmış JSON Web Jetonları (JWT) oluşturması beklenir. Bunlar daha sonra cep telefonları gibi güvenilmeyen ortamlara verilebilir.

Kimlik doğrulama tasarımı ilkeleri

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

  • IAM rolleri, ana hesap için izin verilen kaynaklar üzerinde izin verilen bir grup 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 izin verilir ve bu rol, kimlik doğrulama ve yetkilendirme için JWT'lerin kullanımıyla sınırlıdır.

  • JWT iddiaları, güvenilmeyen ortamlar için 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 düzeyine sahip bir ortamda çalışan kodunuzun, JWT yayınlaması için önce güvenilir ortamda çalışan kodunuzu çağırması gerekir.

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

    1. Çağrı sorumlusu, 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ı oluşturur.

  2. Filo yöneticisi, hizmet hesaplarına belirli IAM rolleri 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 imzalar ve yayınlar. İ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 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 Yöneticisi<>

roles/fleetengine.deliveryAdmin
Teslim kaynakları için okuma ve yazma izni verir. Bu role sahip ana hesapların JWT kullanması gerekmez, bunun yerine Uygulama Varsayılan Kimlik Bilgilerini kullanmalıdır. Özel JWT talepleri yok sayı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 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, güvenilir olmayan ortamlarda Fleet Engine API'lerine erişimi kısıtlamak için JWT'leri kullanır. GitHub'da bulunan 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.

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 - GetTaskTrackingInfoAPI ç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.