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