トークンとは
信頼性の低い環境からの API メソッド呼び出しの場合、Fleet Engine では、適切なサービス アカウントによって署名された JSON Web Token(JWT)を使用する必要があります。信頼性の低い環境には、スマートフォンやブラウザが含まれます。JWT は、完全に信頼できる環境であるサーバー上で生成されます。JWT は署名され、暗号化されて、有効期限が切れるか無効になるまで、その後のサーバー インタラクションのためにクライアントに渡されます。
バックエンドは、標準のアプリケーションのデフォルト認証情報メカニズムを使用して、Fleet Engine に対して認証と承認を行う必要があります。適切なサービス アカウントで署名された JWT を使用してください。サービス アカウントのロールの一覧については、Fleet Engine の基本の Fleet Engine サービス アカウントのロールをご覧ください。
一方、バックエンドは、標準のアプリケーションのデフォルト認証情報メカニズムを使用して、Fleet Engine に対して認証と承認を行う必要があります。
JSON Web Token の詳細については、Fleet Engine の基本の JSON Web Token をご覧ください。
クライアントはどのようにトークンを取得しますか?
ドライバーまたはユーザーが適切な認可認証情報を使用してアプリにログインすると、そのデバイスから発行される更新では、適切な認可トークンを使用する必要があります。このトークンは、アプリの権限を Fleet Engine に通知します。
デベロッパーは、クライアントの実装で次の機能を提供する必要があります。
- サーバーから JSON Web Token を取得します。
- トークンを期限切れになるまで再利用し、トークンの更新を最小限に抑えます。
- トークンの有効期限が切れたら更新します。
AuthTokenFactory
クラスは、位置情報の更新時に認可トークンを生成します。SDK は、Fleet Engine に送信する更新情報とともにトークンをパッケージ化する必要があります。SDK を初期化する前に、サーバーサイドの実装でトークンを発行できることを確認します。
Fleet Engine サービスで想定されるトークンの詳細については、Fleet Engine のJSON Web Token の発行をご覧ください。
認可トークン取得ツールの例
AuthTokenFactory
のスケルトン実装を次に示します。
class JsonAuthTokenFactory implements AuthTokenFactory {
private String vehicleServiceToken; // initially null
private long expiryTimeMs = 0;
private String vehicleId;
// This method is called on a thread whose only responsibility is to send
// location updates. Blocking is OK, but just know that no location updates
// can occur until this method returns.
@Override
public String getToken(AuthTokenContext authTokenContext) {
String vehicleId = requireNonNull(context.getVehicleId());
if (System.currentTimeMillis() > expiryTimeMs || !vehicleId.equals(this.vehicleId)) {
// The token has expired, go get a new one.
fetchNewToken(vehicleId);
}
return vehicleServiceToken;
}
private void fetchNewToken(String vehicleId) {
String url = "https://yourauthserver.example/token/" + vehicleId;
try (Reader r = new InputStreamReader(new URL(url).openStream())) {
com.google.gson.JsonObject obj
= com.google.gson.JsonParser.parseReader(r).getAsJsonObject();
vehicleServiceToken = obj.get("VehicleServiceToken").getAsString();
expiryTimeMs = obj.get("TokenExpiryMs").getAsLong();
// The expiry time could be an hour from now, but just to try and avoid
// passing expired tokens, we subtract 10 minutes from that time.
expiryTimeMs -= 10 * 60 * 1000;
this.vehicleId = vehicleId;
} catch (IOException e) {
// It's OK to throw exceptions here. The StatusListener you passed to
// create the DriverContext class will be notified and passed along the failed
// update warning.
throw new RuntimeException("Could not get auth token", e);
}
}
}
この実装では、組み込みの Java HTTP クライアントを使用して、認可サーバーから JSON 形式のトークンを取得します。クライアントはトークンを保存して再利用し、古いトークンが有効期限の 10 分以内にある場合はトークンを再取得します。
実装では、バックグラウンド スレッドを使用してトークンを更新するなど、異なる処理を行う場合があります。
Fleet Engine で利用可能なクライアント ライブラリについては、オンデマンド ルートサービス用のクライアント ライブラリをご覧ください。