トークンとは
Fleet Engine では、信頼性の低い環境(スマートフォンやブラウザ)からの API メソッド呼び出しに JSON Web Token(JWT)を使用する必要があります。
JWT はサーバーで生成され、署名、暗号化されて、その後のサーバーとのやり取りのためにクライアントに渡されます。JWT は、有効期限が切れるか、無効になるまで使用されます。
重要な詳細
- アプリケーションのデフォルト認証情報を使用して、Fleet Engine に対する認証と認可を行います。
- 適切なサービス アカウントを使用して JWT に署名します。Fleet Engine の基本の Fleet Engine サービス アカウントのロールをご覧ください。
JSON ウェブトークンの詳細については、Fleet Engine の基本の JSON ウェブトークンをご覧ください。
クライアントがトークンを取得する方法
ドライバーまたは消費者が適切な認証情報を使用してアプリにログインすると、そのデバイスから発行される更新では、適切な認証トークンを使用する必要があります。このトークンは、アプリの権限を 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 で使用可能なクライアント ライブラリについては、予定タスク サービスのクライアント ライブラリをご覧ください。