Topik ini menjelaskan cara menghubungkan aplikasi Java ke Identity as a Service (IDaaS).
Untuk informasi lebih lanjut tentang cara kerja koneksi dan proses pemanggilan, lihat Ikhtisar.
Anda harus menyelesaikan satu atau dua langkah berikut untuk menerapkan sinkronisasi akun:
Verifikasi tanda tangan
Dekripsi (opsional)
Setelah prosedur sebelumnya selesai, aplikasi akan menerima permintaan dari peristiwa ini dan menangani permintaan tersebut.
1. Verifikasi tanda tangan
Peroleh titik akhir kunci publik dari konfigurasi sinkronisasi aplikasi. Untuk informasi lebih lanjut, lihat Sinkronisasi akun - Sinkronkan akun IDaaS pada aplikasi.

Dalam topik ini, sebuah kelas utilitas Java yang secara langsung memperoleh kunci publik dari titik akhir kunci publik disediakan. Jika bahasa pemrograman yang Anda gunakan memerlukan informasi kunci publik, Anda mungkin perlu mengklik URL titik akhir kunci publik untuk memperoleh kunci publik, lalu menyimpan kunci publik dalam file .pem secara lokal.
Kode berikut memberikan contoh kunci publik:
{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"kid": "KEY3PdQDx97********h83p8husNSC9AKMH",
"n": "rLUnH5PNeGUZE-********GGIxyM5O7TDdaG4********D9mV1CjE8hVHBxXM96IcCCH_1xmUZEZRp_MBP6m2XeNWUXanCpeyuIAD2kxmaQAqituZdIlT4l3-q9gtccdY-khaE-OfH9qYZhlxFcYj0gVtOvKZFIkuGhME4IQJd_RAWS3OPXxtbGhO2fZYCiuuc8NWub5mcVQnqsy5aJPLwHbVwVUwYNOmaq97_m2TtPcIVWtw7AOzX8O78UrYnYt_QPrv7uVdJMbHleSOx2A1IXqrAkJWecwFfvTsBTCUOPPDeVRQEHzzwmf3zpz5KMgHZU1I5pyqi0KJ6BuMHWw"
}
]
}Contoh berikut menunjukkan cara menambahkan dependensi ke proyek Maven Anda:
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
<version>0.7.9</version>
</dependency>Kode berikut adalah untuk kelas utilitas yang digunakan untuk memperoleh kunci publik dari titik akhir kunci publik IDaaS dan memverifikasi tanda tangannya. Anda dapat langsung menyalin dan menggunakan kode tersebut.
import org.apache.commons.codec.binary.StringUtils;
import org.jose4j.jwk.JsonWebKey;
import org.jose4j.jwk.JsonWebKeySet;
import org.jose4j.jwt.consumer.JwtConsumer;
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
import org.jose4j.lang.JoseException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class JwtUtil {
private final static ConcurrentMap<String, JsonWebKeySet> IDAAS_SIGN_JWK_SET_MAP = new ConcurrentHashMap<>();
public static JwtConsumer createJwtConsumerFromUrl(String jwkUrl, String appId) {
try {
final JsonWebKeySet jsonWebKeySet = getJsonWebKeySetByUrl(jwkUrl);
return createJwtConsumer(jsonWebKeySet, appId);
} catch (Exception e) {
throw new RuntimeException("Fetch JWKs from url failed: " + e.getMessage() + ", " + jwkUrl, e);
}
}
public static JwtConsumer createJwtConsumer(JsonWebKeySet jsonWebKeySet, String appId) {
final JwtConsumerBuilder jwtConsumerBuilder = new JwtConsumerBuilder();
jwtConsumerBuilder.setExpectedIssuer("urn:alibaba:idaas:app:event");
jwtConsumerBuilder.setRequireExpirationTime();
jwtConsumerBuilder.setRequireJwtId();
jwtConsumerBuilder.setRequireIssuedAt();
jwtConsumerBuilder.setRequireExpirationTime();
jwtConsumerBuilder.setMaxFutureValidityInMinutes(1);
jwtConsumerBuilder.setAllowedClockSkewInSeconds(120);
jwtConsumerBuilder.setExpectedAudience(appId);
jwtConsumerBuilder.setVerificationKeyResolver((jws, nestingContext) -> {
final String signKeyId = jws.getKeyIdHeaderValue();
for (JsonWebKey jsonWebKey : jsonWebKeySet.getJsonWebKeys()) {
if (StringUtils.equals(jsonWebKey.getKeyId(), signKeyId)) {
return jsonWebKey.getKey();
}
}
throw new RuntimeException("Cannot find verification key: " + signKeyId);
});
return jwtConsumerBuilder.build();
}
synchronized private static JsonWebKeySet getJsonWebKeySetByUrl(String jwkUrlString) throws IOException, JoseException {
JsonWebKeySet jsonWebKeySet = IDAAS_SIGN_JWK_SET_MAP.get(jwkUrlString);
if (jsonWebKeySet == null) {
jsonWebKeySet = innerGetJsonWebKeySetByUrl(jwkUrlString);
IDAAS_SIGN_JWK_SET_MAP.put(jwkUrlString, jsonWebKeySet);
}
return jsonWebKeySet;
}
private static JsonWebKeySet innerGetJsonWebKeySetByUrl(String jwkUrlString) throws IOException, JoseException {
final URL jwkUrl = new URL(jwkUrlString);
final URLConnection urlConnection = jwkUrl.openConnection();
urlConnection.setConnectTimeout(50000);
urlConnection.setReadTimeout(50000);
final String jwkSetJson = new String(readAll(urlConnection.getInputStream()), StandardCharsets.UTF_8);
return new JsonWebKeySet(jwkSetJson);
}
public static byte[] readAll(InputStream inputStream) throws IOException {
final byte[] buffer = new byte[1024 * 8];
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
for (int len; ((len = inputStream.read(buffer)) != -1); ) {
baos.write(buffer, 0, len);
}
return baos.toByteArray();
}
}Kode berikut memberikan contoh untuk pemanggilan:
// Kunci publik -> Peroleh kunci publik dengan mengakses titik akhir kunci publik dalam konfigurasi sinkronisasi aplikasi di IDaaS.
String publicKey = "{\n"
+ " \"keys\": [\n"
+ " {\n"
+ " \"kty\": \"RSA\",\n"
+ " \"e\": \"AQAB\",\n"
+ " \"use\": \"sig\",\n"
+ " \"kid\": \"KEYHH4yFa1c*******qNo1nJ7nM2FR3595P1\",\n"
+ " \"n\": \"oy_xxxxxxxxxxxxxxxxxxxxxxx95d1padSEABqIbcTKcnlTaET3WHaR"
+ "-3MvsooeZWluv94GQEp-U2jzM1adgTqBl_7KPjUk0dwrZbob_8pOLX5UQMF7Oo_nH5-H5EyL9-yGGhFA4oeuA"
+ "-b73qXShxP7eHs5xTT1kiYEu2NE3rBZdtrRwUiC_h1DvZMtyWFOPwm3dpLiwCcdlgcKvVuSEXyCBj6Gjevn3_G1guVQ2kHlNOVyNn6Ky1iGQJzXctJCEJ5fnBRs4XZZbPNSciYMD2-__cRdbYPtGyyuoEAfouw\"\n"
+ " }\n"
+ " ]\n"
+ "}";;
// ID Aplikasi -> Temukan ID aplikasi dalam daftar aplikasi.
String appId = "app_mjavzivahje6zxxxx";
// JwtUtil -> Kelas utilitas JwtUtil disediakan di bawah ini.
JwtConsumer jwtConsumer = JwtUtil.createJwtConsumer(new JsonWebKeySet(publicKey),appId);
// Dapatkan payload setelah tanda tangan JSON Web Token (JWT) diverifikasi.
// Nilai parameter event -> Nilai parameter yang diterima oleh operasi API.
JwtClaims jwtClaims=jwtConsumer.processToClaims ("Nilai parameter event");
// Dapatkan payload spesifik.
Map<String, Object> map = jwtClaims.getClaimsMap();
// Proses bisnis berdasarkan data spesifik.2. Dekripsi (opsional)
Dekripsi data
Jika Enkripsi Data Layanan diaktifkan untuk aplikasi, data peristiwa dienkripsi dan ditransmisikan dalam cipher_data. Aplikasi harus mendekripsi nilai cipher_data untuk memperoleh data peristiwa.
Anda dapat memasukkan kunci enkripsi atau klik Generate Key untuk menghasilkan kunci enkripsi.

Salin kunci dan gunakan selama dekripsi.
Contoh berikut menunjukkan cara menambahkan dependensi ke proyek Maven Anda:
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
<version>0.7.9</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>Kode berikut memberikan contoh untuk dekripsi:
public String decrypte(String cipherData,String key) throws JoseException {
String alg = "AES";
// Hasilkan KeySpec dengan menggunakan kunci.
SecretKeySpec secretKeySpec = new SecretKeySpec(Hex.decode(key), alg);
JsonWebKey jsonWebKey = JsonWebKey.Factory.newJwk(secretKeySpec);
JsonWebEncryption receiverJwe = new JsonWebEncryption();
// Setel mekanisme enkripsi dan dekripsi.
AlgorithmConstraints algConstraints = new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.PERMIT, new String[]{"dir"});
receiverJwe.setAlgorithmConstraints(algConstraints);
AlgorithmConstraints encConstraints = new AlgorithmConstraints(
AlgorithmConstraints.ConstraintType.PERMIT, new String[]{"A256GCM", "A192GCM", "A128GCM"});
receiverJwe.setContentEncryptionAlgorithmConstraints(encConstraints);
// Tentukan kunci dan teks sandi.
receiverJwe.setKey(jsonWebKey.getKey());
receiverJwe.setCompactSerialization(cipherData);
// Kembalikan konten yang didekripsi.
return new String(receiverJwe.getPlaintextBytes(), StandardCharsets.UTF_8);
}