توکن چیست؟
Fleet Engine برای فراخوانیهای روش میانای برنامهسازی کاربردی از محیطهای با اعتماد پایین (تلفنهای هوشمند و مرورگرها) به استفاده از JSON Web Tokens (JWTs) نیاز دارد.
JWT در سرور شما ایجاد میشود، امضا و رمزگذاری میشود، و برای تعاملات بعدی سرور به کارخواه ارسال میشود تا زمانی که منقضی شود یا دیگر معتبر نباشد.
جزئیات کلید
- از اعتبارنامههای پیشفرض برنامه برای اصالتسنجی و صدور مجوز در Fleet Engine استفاده کنید.
- از حساب خدمات مناسبی برای امضای JWT استفاده کنید. نقشهای حساب سرویس Fleet Engine را در مبانی Fleet Engine ببینید.
برای اطلاعات بیشتر درباره «نشانههای وب JSON»، به نشانههای وب JSON در Fleet Engine Essentials مراجعه کنید.
کلاینتها چگونه توکن دریافت میکنند؟
وقتی راننده یا مصرفکننده بااستفاده از اعتبارنامه اصالتسنجی مناسب به سیستم برنامه شما وارد میشود، هر بهروزرسانی صادرشده از آن دستگاه باید از کدهای مجازسازی مناسب استفاده کند که اجازههای برنامه را به Fleet Engine اطلاع میدهد.
بهعنوان توسعهدهنده، پیادهسازی مشتری شما باید توانایی انجام کارهای زیر را فراهم کند:
- یک JSON Web Token از سرور خود واکشی کنید.
- برای بهحداقل رساندن بازآوریهای کد، از کد تا زمان انقضای آن مجدداً استفاده کنید.
- وقتی ژتون منقضی شد، آن را بازآوری کنید.
پروتکل GMTDAuthorization نشانهای وب JSON را در زمان بهروزرسانی مکان
براساس شیء GMTD AuthorizationContext واکشی میکند. کیت توسعه نرمافزار
باید توکنها را با اطلاعات بهروزرسانی بستهبندی کند تا به Fleet Engine ارسال شود.
مطمئن شوید که پیادهسازی سمت سرور شما میتواند قبلاز مقداردهی اولیه کیت توسعه نرمافزار،
کد صادر کند.
برای جزئیات مربوط به نشانهای موردانتظار Fleet Engine، به صدور نشانهای وب JSON برای Fleet Engine مراجعه کنید.
providerID همان شناسه پروژه Google Cloud Project شما است. برای کسب اطلاعات درباره راهاندازی «پروژه Google Cloud»، ایجاد پروژه Fleet Engine را ببینید.
نمونهای از واکشیکننده کد اصالتسنجی
مثال زیر پیادهسازی پروتکل GMTDAuthorization را نشان میدهد.
Swift
import GoogleRidesharingDriver
private let providerURL = "INSERT_YOUR_TOKEN_PROVIDER_URL"
class SampleAccessTokenProvider: NSObject, GMTDAuthorization {
private struct AuthToken {
// The cached vehicle token.
let token: String
// Keep track of when the token expires for caching.
let expiration: TimeInterval
// Keep track of the vehicle ID the cached token is for.
let vehicleID: String
}
enum AccessTokenError: Error {
case missingAuthorizationContext
case missingData
}
private var authToken: AuthToken?
func fetchToken(
with authorizationContext: GMTDAuthorizationContext?,
completion: @escaping GMTDAuthTokenFetchCompletionHandler
) {
// Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
guard let authorizationContext = authorizationContext else {
completion(nil, AccessTokenError.missingAuthorizationContext)
return
}
let vehicleID = authorizationContext.vehicleID
// If appropriate, use the cached token.
if let authToken = authToken,
authToken.expiration > Date.now.timeIntervalSince1970 && authToken.vehicleID == vehicleID
{
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 vehicleTokenKey = "VEHICLE_TOKEN_KEY"
let tokenExpirationKey = "TOKEN_EXPIRATION"
guard let data = data,
let fetchData = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
let token = fetchData[vehicleTokenKey] as? String,
let expiration = fetchData[tokenExpirationKey] as? Double
else {
completion(nil, AccessTokenError.missingData)
return
}
strongSelf.authToken = AuthToken(
token: token, expiration: expiration, vehicleID: vehicleID)
completion(token, nil)
}
task.resume()
}
}
آبجکتیو-سی
#import "SampleAccessTokenProvider.h"
#import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
// SampleAccessTokenProvider.h
@interface SampleAccessTokenProvider : NSObject<GMTDAuthorization>
@end
static NSString *const PROVIDER_URL = @"INSERT_YOUR_TOKEN_PROVIDER_URL";
// SampleAccessTokenProvider.m
@implementation SampleAccessTokenProvider{
// The cached vehicle token.
NSString *_cachedVehicleToken;
// Keep track of the vehicle ID the cached token is for.
NSString *_lastKnownVehicleID;
// Keep track of when tokens expire for caching.
NSTimeInterval _tokenExpiration;
}
- (void)fetchTokenWithContext:(nullable GMTDAuthorizationContext *)authorizationContext
completion:(nonnull GMTDAuthTokenFetchCompletionHandler)completion {
if (!completion) {
NSAssert(NO, @"%s encountered an unexpected nil completion.", __PRETTY_FUNCTION__);
return;
}
// Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
NSString *vehicleID = authorizationContext.vehicleID;
if (!vehicleID) {
NSAssert(NO, @"Vehicle ID is missing from authorizationContext.");
return;
}
// Clear cached vehicle token if vehicle ID has changed.
if (![_lastKnownVehicleID isEqual:vehicleID]) {
_tokenExpiration = 0.0;
_cachedVehicleToken = nil;
}
_lastKnownVehicleID = vehicleID;
// Clear cached vehicletoken if it has expired.
if ([[NSDate date] timeIntervalSince1970] > _tokenExpiration) {
_cachedVehicleToken = nil;
}
// If appropriate, use the cached token.
if (_cachedVehicleToken) {
completion(_cachedVehicleToken, 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 *vehicleTokenKey = @"VEHICLE_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->_cachedVehicleToken = JSONResponse[vehicleTokenKey];
completion(JSONResponse[vehicleTokenKey], 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