トークンとは
Fleet Engine では、信頼度の低い環境(スマートフォンやブラウザ)からの API メソッド呼び出しに JSON ウェブトークン(JWT)を使用する必要があります。
JWT はサーバーで生成され、署名、暗号化されて、有効期限が切れるか無効になるまで、以降のサーバーとのやり取りのためにクライアントに渡されます。
重要な詳細
- アプリケーションのデフォルト認証情報を使用して、Fleet Engine に対して認証と 認可を行います。
- 適切なサービス アカウントを使用して JWT に署名します。Fleet Engine の基本 の Fleet Engine サービス アカウントのロールをご覧ください。
JSON ウェブトークンの詳細については、Fleet Engine の基本 の JSON ウェブトークンをご覧ください。
クライアントがトークンを取得する方法
ドライバーまたは消費者が適切な認証情報を使用してアプリにログインすると、そのデバイスから発行される更新には適切な認証トークンを使用する必要があります。これにより、アプリの権限が Fleet Engine に伝達されます。
デベロッパーとして、クライアント実装では次のことを行えるようにする必要があります。
- サーバーから JSON ウェブトークンを取得する。
- トークンの更新を最小限に抑えるため、有効期限が切れるまでトークンを再利用する。
- 有効期限が切れたらトークンを更新する。
AuthTokenFactory クラスは、位置情報の更新時に認証トークンを生成します。SDK は、Fleet Engine に送信する更新情報にトークンをパッケージ化する必要があります。SDK を初期化する前に、サーバー側の実装でトークンを発行できることを確認してください。
Fleet Engine サービスで想定されるトークンの詳細については、JSON ウェブトークンを Fleet Engine 用に発行するをご覧ください。
認証トークン フェッチャーの例
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 で使用できるクライアント ライブラリについては、 スケジュール設定されたタスク サービスのクライアント ライブラリをご覧ください。