دریافت نمودارهای اصالت‌سنجی

رمز چیست؟

‫Fleet Engine برای فراخوانی روش‌های API از توکن‌های وب JSON (JWT) از محیط‌های با اعتماد پایین: تلفن‌های هوشمند و مرورگرها استفاده می‌کند.

‫JWT در سرور شما ایجاد می‌شود، امضا و رمزگذاری می‌شود، و به کارخواه ارسال می‌شود تا زمانی که منقضی شود یا دیگر معتبر نباشد برای تعاملات بعدی با سرور استفاده شود.

جزئیات کلیدی

برای اطلاعات بیشتر درباره «نشان‌های وب JSON»، به نشان‌های وب JSON در ملزومات موتور ناوگان مراجعه کنید.

کاربران چگونه نشان دریافت می‌کنند؟

وقتی راننده یا مصرف‌کننده بااستفاده از اعتبارنامه اصالت‌سنجی مناسب به سیستم برنامه شما وارد می‌شود، هر به‌روزرسانی صادرشده از آن دستگاه باید از کدهای مجوز مناسب استفاده کند که اجازه‌های برنامه را به Fleet Engine منتقل می‌کند.

به‌عنوان توسعه‌دهنده، پیاده‌سازی مشتری شما باید امکان انجام موارد زیر را فراهم کند:

  • «توکن وب JSON» را از سرورتان واکشی کنید.
  • برای به‌حداقل رساندن بازآوری‌های رمز، تا زمان انقضای رمز از آن استفاده مجدد کنید.
  • وقتی ژتون منقضی شد، آن را بازآوری کنید.

پروتکل GMTDAuthorization، توکن‌های JSON Web را در زمان به‌روزرسانی مکان براساس شیء GMTD AuthorizationContext واکشی می‌کند. «کیت توسعه نرم‌افزار» باید نشان‌ها را با اطلاعات به‌روزرسانی بسته‌بندی کند تا به Fleet Engine ارسال کند. مطمئن شوید که پیاده‌سازی سمت سرور شما می‌تواند قبل‌از مقداردهی اولیه کیت توسعه نرم‌افزار، کد صادر کند.

برای جزئیات نشانه‌های موردانتظار Fleet Engine، به صدور «نشانه‌های وب JSON» برای Fleet Engine مراجعه کنید.

providerID همان شناسه پروژه Google Cloud Project شما است. برای کسب اطلاعات درباره راه‌اندازی «پروژه Google Cloud»، به ایجاد پروژه Fleet Engine مراجعه کنید.

نمونه‌ای از واکشی‌کننده نمودافزار اصالت‌سنجی

مثال زیر ارائه‌دهنده کد مجوز را پیاده‌سازی می‌کند:

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()
  }
}

آبجکتیو-سی

/*
 * 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

بعدی چیست

مقداردهی اولیه کیت توسعه نرم‌افزار مصرف‌کننده