OpenID Connect (OIDC) adalah lapisan identitas di atas OAuth 2.0. Aplikasi Anda dapat menggunakan OIDC untuk memperoleh informasi tentang pengguna yang masuk ke Alibaba Cloud.
Prasyarat
Anda telah menyelesaikan tugas-tugas berikut: Create an application, Manage OAuth scopes, dan Create a client secret.
Konsep utama
|
Concept |
Description |
|
ID token |
OIDC mengeluarkan ID token yang merepresentasikan pengguna yang telah masuk. Token tersebut berisi informasi pengguna seperti nama dan nama login, tetapi tidak dapat mengakses layanan Alibaba Cloud. |
|
OIDC discovery endpoint |
Protokol OIDC mendefinisikan beberapa endpoint. Endpoint discovery berisi seluruh konfigurasi OIDC, sehingga menyederhanakan integrasi bagi developer. Catatan
Endpoint discovery mengembalikan dokumen JSON berisi metadata penyedia, termasuk jenis respons yang didukung, nilai issuer, URL kunci publik untuk verifikasi tanda tangan ID token, serta algoritma tanda tangan yang didukung. Alibaba Cloud OIDC discovery endpoint: Contoh respons dari endpoint discovery:
|
Cara kerja

-
Pengguna masuk ke aplikasi dari browser.
-
Aplikasi Anda mengarahkan browser pengguna ke layanan OIDC Alibaba Cloud.
CatatanJika pengguna belum masuk, permintaan akan dialihkan lebih lanjut ke layanan sign-in Alibaba Cloud.
-
Pengguna masuk ke Alibaba Cloud dan memberikan otorisasi kepada aplikasi Anda.
-
Layanan OIDC Alibaba Cloud mengarahkan kembali browser pengguna ke aplikasi Anda, menyertakan kode otorisasi.
-
Aplikasi Anda menukar kode otorisasi tersebut dengan ID token dari layanan OIDC Alibaba Cloud.
-
Layanan OIDC Alibaba Cloud mengembalikan ID token dan access token ke aplikasi. Aplikasi kemudian dapat memperoleh informasi pengguna baik melalui ID token maupun access token.
Kasus penggunaan umum:
-
Mengurai langsung ID token untuk memperoleh informasi pengguna.
Aplikasi harus memverifikasi tanda tangan ID token: memperoleh kunci publik (Contoh 1: Dapatkan kunci publik tanda tangan), memverifikasi tanda tangan JWT (Contoh 2: Verifikasi tanda tangan JWT), dan mengurai informasi pengguna (Contoh 3: Uraikan ID token).
-
Menggunakan ID token untuk komunikasi antar modul berbeda.
Aplikasi harus memverifikasi tanda tangan ID token: memperoleh kunci publik (Contoh 1: Dapatkan kunci publik tanda tangan) dan memverifikasi tanda tangan JWT (Contoh 2: Verifikasi tanda tangan JWT).
-
Menggunakan access token untuk mengkueri informasi pengguna secara berulang.
Setelah memperoleh access token, aplikasi memanggil endpoint UserInfo untuk mengambil informasi pengguna (Contoh 4: Gunakan endpoint UserInfo).
-
Contoh 1: Dapatkan kunci publik tanda tangan
Contoh permintaan:
private List getSignPublicKey() {
HttpResponse response = HttpClientUtils.doGet("https://oauth.alibabacloud.com/v1/keys");
List rsaKeyList = new ArrayList();
if (response.getCode() == 200 && response.isSuccess()) {
String keys = JSON.parseObject(response.getData()).getString("keys");
try {
JSONArray publicKeyList = JSON.parseArray(keys);
for (Object object : publicKeyList) {
RSAKey rsaKey = RSAKey.parse(JSONObject.toJSONString(object));
rsaKeyList.add(rsaKey);
}
return rsaKeyList;
} catch (Exception e) {
LOG.info(e.getMessage());
}
}
LOG.info("GetSignPublicKey failed:{}", response.getData());
throw new AuthenticationException(response.getData());
}
Contoh 2: Verifikasi tanda tangan JWT
ID token Alibaba Cloud adalah JSON Web Token (JWT) yang ditandatangani. Algoritma tanda tangan adalah RS256, sebagaimana didefinisikan oleh standar JWS. Validasi setiap ID token dengan memeriksa:
-
Validasi tanda tangan: Gunakan kunci publik layanan OAuth (Contoh 1) untuk memverifikasi keaslian dan integritas ID token.
Layanan OAuth melakukan rotasi kunci publik secara berkala. Saat memperoleh kunci publik:
-
Ambil kunci publik per permintaan. Jangan menyimpannya dalam cache jangka panjang.
-
Selama rotasi kunci, layanan mungkin mengembalikan beberapa kunci yang valid. Coba setiap kunci hingga salah satunya berhasil memverifikasi tanda tangan. Jangan mengasumsikan jumlah kunci tetap.
Contoh permintaan:
public boolean verifySign(SignedJWT signedJWT) { List publicKeyList = getSignPublicKey(); RSAKey rsaKey = null; for (RSAKey key : publicKeyList) { if (signedJWT.getHeader().getKeyID().equals(key.getKeyID())) { rsaKey = key; } } if (rsaKey != null) { try { RSASSAVerifier verifier = new RSASSAVerifier(rsaKey.toRSAPublicKey()); if (signedJWT.verify(verifier)) { return true; } } catch (Exception e) { LOG.info("Verify exception:{}", e.getMessage()); } } throw new AuthenticationException("Can't verify signature for id token"); } -
-
Validasi masa berlaku: Periksa apakah waktu penerbitan dan waktu kedaluwarsa token valid.
-
Validasi audience: Pastikan klaim aud sesuai dengan client ID aplikasi Anda.
Contoh 3: Uraikan ID token
-
Parameter respons
-
Header claims
Parameter
Description
OAuth scope
alg
Algoritma tanda tangan.
openid
kid
ID kunci publik yang digunakan untuk menandatangani token. Gunakan kunci ini untuk memverifikasi tanda tangan dan mencegah manipulasi.
openid
-
Body claims
Parameter
Description
OAuth scope
exp
Timestamp yang menunjukkan waktu kedaluwarsa token.
openid
sub
Identifikasi unik dan stabil untuk pengguna yang telah masuk. Tidak mencakup informasi seperti UID Alibaba Cloud atau username.
CatatanJika pengguna yang masuk adalah RAM role, klaim sub dihasilkan dari
<RoleId:RoleSessionName>. Setiap sesi role memiliki nilai sub sendiri.openid
aud
Audience token, yaitu client ID aplikasi Anda.
openid
iss
Penerbit token. Nilainya adalah https://oauth.alibabacloud.com.
openid
iat
Timestamp yang menunjukkan kapan token diterbitkan.
openid
type
Jenis pengguna yang telah masuk. Nilai yang valid:
-
account: Akun Alibaba Cloud (akun utama).
-
user: RAM user.
-
role: RAM role.
profile
name
Nama tampilan pengguna yang telah masuk. Nilai yang valid:
-
Untuk RAM user: nama tampilan RAM user tersebut.
-
Untuk RAM role:
<RoleName:RoleSessionName>.
CatatanKlaim ini hanya dikembalikan untuk RAM user atau RAM role.
profile
upn
Nama login RAM user.
CatatanKlaim ini hanya dikembalikan untuk RAM user.
profile
login_name
Nama login akun Alibaba Cloud (akun utama).
CatatanKlaim ini hanya dikembalikan untuk akun Alibaba Cloud (akun utama).
profile
aid
ID akun Alibaba Cloud tempat pengguna tersebut terdaftar.
aliuid
uid
ID pengguna yang telah masuk. Nilai yang valid:
-
Untuk akun Alibaba Cloud (akun utama): ID akun Alibaba Cloud, yang sama dengan nilai aid.
-
Untuk RAM user: ID RAM user.
-
Untuk RAM role: ID RAM role.
aliuid
-
-
-
Contoh respons
-
Contoh header
{ "alg": "RS256", "kid": "JC9wxzrhqJ0gtaCEt2QLUfevEUIwltFhui4O1bh****" } -
Contoh body
Contoh-contoh berikut menunjukkan muatan (payload) ID token yang telah didekode. Token aktual berupa string JWT terenkripsi tunggal yang harus diverifikasi (Contoh 2: Verifikasi tanda tangan JWT).
-
Contoh payload untuk akun Alibaba Cloud
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "account", "login_name":"alice@example.com", // Nama login akun Alibaba Cloud "aid": "123456789012****", // ID akun Alibaba Cloud "uid": "123456789012****" // ID akun Alibaba Cloud } -
Contoh payload untuk RAM user
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "user", "name": "alice", // Nama tampilan RAM user "upn": "alice@example.onaliyun.com", // Nama login RAM user "aid": "123456789012****", // ID akun Alibaba Cloud tempat RAM user terdaftar "uid": "234567890123****" // ID RAM user } -
Contoh payload untuk RAM role
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "role", "name": "NetworkAdministrator:alice", // Nama tampilan RAM role "aid": "123456789012****", // ID akun Alibaba Cloud tempat RAM role terdaftar "uid": "300800165472****" // ID RAM role }
-
-
Contoh 4: Gunakan endpoint UserInfo
Anda juga dapat memanggil endpoint UserInfo dengan access token untuk mengambil informasi pengguna. Responsnya tidak dienkripsi.
Meskipun Anda hanya meminta scope openid, aliuid, dan profile, access token tetap dikembalikan. Token ini hanya berlaku untuk endpoint UserInfo.
URL endpoint UserInfo adalah https://oauth.alibabacloud.com/v1/userinfo.
Contoh permintaan:
GET v1/userinfo HTTP/1.1
Host: oauth.alibabacloud.com
Authorization: Bearer SIAV32hkKG
Parameter respons:
|
Parameter |
Description |
OAuth scope |
|
sub |
Identifikasi unik dan stabil untuk pengguna yang telah masuk. Tidak mencakup informasi seperti UID Alibaba Cloud atau username. |
openid |
|
type |
Jenis pengguna yang telah masuk. |
profile |
|
name |
Nama tampilan pengguna yang telah masuk. Catatan
Parameter ini hanya dikembalikan untuk RAM user atau RAM role. |
profile |
|
upn |
Nama login RAM user. Catatan
Parameter ini hanya dikembalikan untuk RAM user. |
profile |
|
login_name |
Nama login akun Alibaba Cloud (akun utama). Catatan
Parameter ini hanya dikembalikan untuk akun Alibaba Cloud (akun utama). |
profile |
|
aid |
ID akun Alibaba Cloud tempat pengguna tersebut terdaftar. |
aliuid |
|
uid |
ID pengguna yang telah masuk. |
aliuid |
Contoh respons:
-
Contoh respons untuk akun Alibaba Cloud
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "account", "login_name":"alice@example.com", // Nama login akun Alibaba Cloud "aid": "123456789012****", // ID akun Alibaba Cloud "uid": "123456789012****" // ID akun Alibaba Cloud } -
Contoh respons untuk RAM user
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "user", "name": "alice", // Nama tampilan RAM user "upn": "alice@example.onaliyun.com", // Nama login RAM user "aid": "123456789012****", // ID akun Alibaba Cloud tempat RAM user terdaftar "uid": "234567890123****" // ID RAM user } -
Contoh respons untuk RAM role
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "role", "name": "NetworkAdministrator:alice", // Nama tampilan RAM role "aid": "123456789012****", // ID akun Alibaba Cloud tempat RAM role terdaftar "uid": "300800165472****" // ID RAM role }