Co to jest token?
Fleet Engine wymaga używania tokenów sieciowych JSON (JWT) w przypadku wywołań metod interfejsu API z środowisk o niskim poziomie zaufania: smartfonów i przeglądarek.
Token JWT pochodzi z Twojego serwera, jest podpisany i zaszyfrowany, a następnie przekazywany do klienta w celu dalszych interakcji z serwerem, dopóki nie wygaśnie lub nie będzie już ważny.
Najważniejsze informacje
- Użyj domyślnego uwierzytelniania aplikacji, aby uwierzytelniać i autoryzować dostęp do Fleet Engine.
 - Używaj odpowiedniego konta usługi do podpisywania tokenów JWT. Więcej informacji o rolach konta usługi Fleet Engine znajdziesz w artykule Podstawowe informacje o Fleet Engine.
 
Więcej informacji o tokenach sieciowych JSON znajdziesz w sekcji Tokeny sieciowe JSON w podstawowych informacjach o Fleet Engine.
Jak klienci otrzymują tokeny?
Gdy kierowca lub konsument zaloguje się w aplikacji za pomocą odpowiednich danych uwierzytelniających, wszystkie aktualizacje wysyłane z tego urządzenia muszą używać odpowiednich tokenów autoryzacji, które informują Fleet Engine o uprawnieniach aplikacji.
Jako deweloper musisz zapewnić w implementacji klienta możliwość wykonania tych czynności:
- Pobierz token sieciowy JSON z serwera.
 - Używaj tokena ponownie, aż wygaśnie, aby zminimalizować liczbę odświeżeń tokena.
 - Odświeżaj token, gdy wygaśnie.
 
Protokół GMTDAuthorization pobiera tokeny sieciowe JSON w momencie aktualizacji lokalizacji na podstawie obiektu GMTD AuthorizationContext. Pakiet SDK musi spakować tokeny z informacjami o aktualizacji, aby wysłać je do Fleet Engine.
Zanim zainicjujesz pakiet SDK, upewnij się, że implementacja po stronie serwera może wydawać tokeny.
Szczegółowe informacje o tokenach oczekiwanych przez Fleet Engine znajdziesz w artykule Wystawianie tokenów sieciowych JSON dla Fleet Engine.
Identyfikator dostawcy jest taki sam jak identyfikator projektu w Twoim projekcie Google Cloud. Informacje o konfigurowaniu projektu Google Cloud znajdziesz w artykule Tworzenie projektu Fleet Engine.
Przykład pobierania tokena uwierzytelniania
Poniższy przykład implementuje dostawcę tokenów autoryzacji:
Swift
/*
 * SampleAccessTokenProvider.swift
 */
import GoogleRidesharingConsumer
private let providerURL = "INSERT_YOUR_TOKEN_PROVIDER_URL"
class SampleAccessTokenProvider: NSObject, GMTCAuthorization {
  private struct AuthToken {
    // The cached trip token.
    let token: String
    // Keep track of when the token expires for caching.
    let expiration: TimeInterval
    // Keep track of the trip ID the cached token is for.
    let tripID: String
  }
  enum AccessTokenError: Error {
    case missingAuthorizationContext
    case missingData
  }
  private var authToken: AuthToken?
  func fetchToken(
    with authorizationContext: GMTCAuthorizationContext?,
    completion: @escaping GMTCAuthTokenFetchCompletionHandler
  ) {
    // Get the trip ID from the authorizationContext. This is set by the Consumer SDK.
    guard let authorizationContext = authorizationContext else {
      completion(nil, AccessTokenError.missingAuthorizationContext)
      return
    }
    let tripID = authorizationContext.tripID
    // If appropriate, use the cached token.
    if let authToken = authToken,
      authToken.expiration > Date.now.timeIntervalSince1970 && authToken.tripID == tripID
    {
      completion(authToken.token, nil)
      return
    }
    // Otherwise, try to fetch a new token from your server.
    let request = URLRequest(url: URL(string: providerURL))
    let task = URLSession.shared.dataTask(with: request) { [weak self] data, _, error in
      guard let strongSelf = self else { return }
      guard error == nil else {
        completion(nil, error)
        return
      }
      // Replace the following key values with the appropriate keys based on your
      // server's expected response.
      let tripTokenKey = "TRIP_TOKEN_KEY"
      let tokenExpirationKey = "TOKEN_EXPIRATION"
      guard let data = data,
        let fetchData = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
        let token = fetchData[tripTokenKey] as? String,
        let expiration = fetchData[tokenExpirationKey] as? Double
      else {
        completion(nil, AccessTokenError.missingData)
        return
      }
      strongSelf.authToken = AuthToken(token: token, expiration: expiration, tripID: tripID)
      completion(token, nil)
    }
    task.resume()
  }
}
Objective-C
/*
 * SampleAccessTokenProvider.h
 */
#import <Foundation/Foundation.h>
#import <GoogleRidesharingConsumer/GoogleRidesharingConsumer.h>
NS_ASSUME_NONNULL_BEGIN
@interface SampleAccessTokenProvider : NSObject <GMTCAuthorization>
@end
NS_ASSUME_NONNULL_END
/*
 * SampleAccessTokenProvider.m
 */
#import "SampleAccessTokenProvider.h"
#import "GoogleRidesharingConsumer/GoogleRidesharingConsumer.h"
static NSString *const PROVIDER_URL = @"INSERT_YOUR_TOKEN_PROVIDER_URL";
// SampleAccessTokenProvider.m
@implementation SampleAccessTokenProvider {
  // The cached token with claims to the current trip.
  NSString *_cachedTripToken;
  // Keep track of the Trip ID the cached token is for.
  NSString *_lastKnownTripID;
  // Keep track of when tokens expire for caching.
  NSTimeInterval _tokenExpiration;
}
- (void)fetchTokenWithContext:(nullable GMTCAuthorizationContext *)authorizationContext
                   completion:(nonnull GMTCAuthTokenFetchCompletionHandler)completion {
  // Get the trip ID from the authorizationContext. This is set by the Consumer SDK.
  NSString *tripID = authorizationContext.tripID;
  // Clear cached trip token if trip ID has changed.
  if (![_lastKnownTripID isEqual:tripID]) {
    _tokenExpiration = 0.0;
    _cachedTripToken = nil;
  }
  _lastKnownTripID = tripID;
  // Clear cached tripToken if it has expired.
  if ([[NSDate date] timeIntervalSince1970] > _tokenExpiration) {
    _cachedTripToken = nil;
  }
  // If appropriate, use the cached token.
  if (_cachedTripToken) {
    completion(_cachedTripToken, nil);
    return;
  }
  // Otherwise, try to fetch a new token from your server.
  NSURL *requestURL = [NSURL URLWithString:PROVIDER_URL];
  NSMutableURLRequest *request =
      [[NSMutableURLRequest alloc] initWithURL:requestURL];
  request.HTTPMethod = @"GET";
  // Replace the following key values with the appropriate keys based on your
  // server's expected response.
  NSString *tripTokenKey = @"TRIP_TOKEN_KEY";
  NSString *tokenExpirationKey = @"TOKEN_EXPIRATION";
  __weak typeof(self) weakSelf = self;
  void (^handler)(NSData *_Nullable data, NSURLResponse *_Nullable response,
                  NSError *_Nullable error) =
      ^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
        typeof(self) strongSelf = weakSelf;
        if (error) {
          completion(nil, error);
          return;
        }
        NSError *JSONError;
        NSMutableDictionary *JSONResponse =
            [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&JSONError];
        if (JSONError) {
          completion(nil, JSONError);
          return;
        } else {
          // Sample code only. No validation logic.
          id expirationData = JSONResponse[tokenExpirationKey];
          if ([expirationData isKindOfClass:[NSNumber class]]) {
            NSTimeInterval expirationTime = ((NSNumber *)expirationData).doubleValue;
            strongSelf->_tokenExpiration = [[NSDate date] timeIntervalSince1970] + expirationTime;
          }
          strongSelf->_cachedTripToken = JSONResponse[tripTokenKey];
          completion(JSONResponse[tripTokenKey], nil);
        }
      };
  NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
  NSURLSession *mainQueueURLSession =
      [NSURLSession sessionWithConfiguration:config delegate:nil
                               delegateQueue:[NSOperationQueue mainQueue]];
  NSURLSessionDataTask *task = [mainQueueURLSession dataTaskWithRequest:request completionHandler:handler];
  [task resume];
}
@end
Co dalej
Inicjowanie pakietu Consumer SDK