টোকেন কী?
কম-বিশ্বস্ত পরিবেশ: স্মার্টফোন এবং ব্রাউজার থেকে API মেথড কলের জন্য Fleet Engine-এর JSON ওয়েব টোকেন (JWTs) ব্যবহার করা প্রয়োজন।
আপনার সার্ভারে একটি JWT তৈরি হয়, সেটি সাইন ও এনক্রিপ্ট করা হয় এবং পরবর্তী সার্ভার ইন্টার্যাকশনের জন্য ক্লায়েন্টের কাছে পাঠানো হয়, যতক্ষণ না এটির মেয়াদ শেষ হয় বা এটি আর বৈধ থাকে না।
গুরুত্বপূর্ণ বিবরণ
- Fleet Engine-এর সাথে যাচাই ও অনুমোদন করতে অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল ব্যবহার করুন।
- JWT-তে সাইন করতে উপযুক্ত পরিষেবা অ্যাকাউন্ট ব্যবহার করুন। Fleet Engine-এর প্রাথমিক তথ্য থেকে Fleet Engine serviceaccount-এর ভূমিকা দেখুন।
JSON ওয়েব টোকেন সম্পর্কে আরও জানতে, Fleet Engine Essentials-এ JSON ওয়েব টোকেন দেখুন।
ক্লায়েন্ট কীভাবে টোকেন পান?
ড্রাইভার বা গ্রাহক সঠিক যাচাইকরণ সংক্রান্ত ক্রেডেনশিয়াল ব্যবহার করে আপনার অ্যাপে লগ-ইন করলে, সেই ডিভাইস থেকে ইস্যু করা যেকোনও আপডেটের ক্ষেত্রে সঠিক অনুমোদনের টোকেন ব্যবহার করতে হবে, যা Fleet Engine-এর সাথে অ্যাপের অনুমতির ব্যাপারে যোগাযোগ করে।
ডেভেলপার হিসেবে, আপনার ক্লায়েন্ট ইমপ্লিমেন্টেশনে নিম্নলিখিত কাজগুলি করার ক্ষমতা থাকা উচিত:
- আপনার সার্ভার থেকে JSON ওয়েব টোকেন ফেচ করুন।
- টোকেন রিফ্রেশ করার সংখ্যা কমাতে, মেয়াদ শেষ না হওয়া পর্যন্ত টোকেনটি আবার ব্যবহার করুন।
- টোকেনের মেয়াদ শেষ হয়ে গেলে সেটি রিফ্রেশ করুন।
GMTDAuthorization প্রোটোকল লোকেশন আপডেট করার সময় GMTD AuthorizationContext অবজেক্টের উপর ভিত্তি করে
JSON ওয়েব টোকেন ফেচ করে। SDK-কে
অবশ্যই Fleet Engine-এ পাঠানোর জন্য আপডেট তথ্যের সাথে টোকেন প্যাকেজ করতে হবে।
SDK শুরু করার আগে আপনার সার্ভার-সাইড ইমপ্লিমেন্টেশন টোকেন ইস্যু করতে পারছে কিনা তা ভাল করে দেখে নিন।
Fleet Engine-এর প্রত্যাশিত টোকেনের বিবরণের জন্য, Fleet Engine-এর জন্য JSON ওয়েব টোকেন ইস্যু করুন দেখুন।
providerID এবং আপনার Google Cloud প্রোজেক্টের প্রোজেক্ট আইডি একই। 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()
}
}
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