Obtenir des jetons d'autorisation

Qu'est-ce qu'un jeton ?

Pour les appels de méthode API provenant d'environnements à faible confiance, Fleet Engine nécessite l'utilisation de jetons Web JSON (JWT) signés par un compte de service approprié. Les environnements à faible confiance incluent les smartphones et les navigateurs. Les jetons JWT proviennent de votre serveur, qui est un environnement entièrement approuvé. Le JWT est signé, chiffré et transmis au client pour des interactions ultérieures avec le serveur jusqu'à ce qu'il expire ou qu'il ne soit plus valide.

Votre backend doit s'authentifier et autoriser l'accès à Fleet Engine à l'aide des mécanismes standards relatifs aux identifiants par défaut de l'application. Assurez-vous d'utiliser des jetons JWT signés par un compte de service approprié. Pour obtenir la liste des rôles de compte de service, consultez les rôles de compte de service Fleet Engine dans la section Principes de base de Fleet Engine.

En revanche, votre backend doit s'authentifier et autoriser l'application auprès de Fleet Engine à l'aide des mécanismes standards d'identifiants par défaut de l'application.

Pour en savoir plus sur les jetons Web JSON, consultez la section Jetons Web JSON dans Principes essentiels de Fleet Engine.

Comment les clients obtiennent-ils des jetons ?

Une fois qu'un conducteur ou un consommateur se connecte à votre application à l'aide des identifiants d'authentification appropriés, toutes les mises à jour effectuées à partir de cet appareil doivent utiliser des jetons d'autorisation appropriés, qui communiquent à Fleet Engine les autorisations de l'application.

En tant que développeur, votre implémentation client doit permettre de procéder comme suit :

  • Récupérez un jeton Web JSON à partir de votre serveur.
  • Réutilisez le jeton jusqu'à son expiration pour limiter les actualisations de jeton.
  • Actualisez le jeton lorsqu'il expire.

Le protocole GMTDAuthorization récupère les jetons Web JSON au moment de la mise à jour de l'emplacement en fonction de l'objet GMTD AuthorizationContext. Le SDK doit empaqueter les jetons avec les informations de mise à jour à envoyer à Fleet Engine. Assurez-vous que votre implémentation côté serveur peut émettre des jetons avant d'initialiser le SDK.

Pour en savoir plus sur les jetons attendus par Fleet Engine, consultez l'article Émettre des jetons Web JSON pour Fleet Engine.

L'ID du fournisseur est identique à l'ID de projet de votre projet Google Cloud. Pour en savoir plus sur la configuration du projet Google Cloud, consultez la section Créer votre projet Fleet Engine.

Exemple de récupérateur de jeton d'authentification

L'exemple suivant implémente un fournisseur de jetons d'autorisation :

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

Étape suivante

Initialiser le SDK Consumer