OpenID Connect (OIDC) adalah lapisan protokol autentikasi yang dibangun di atas OAuth 2.0. Topik ini menjelaskan cara mendapatkan informasi pengguna melalui OIDC.
Prasyarat
Aplikasi web telah dibuat, lengkap dengan nama, cakupan OAuth, dan URL callback yang telah ditentukan. Rahasia aplikasi juga telah dibuat. Untuk informasi selengkapnya, lihat Buat aplikasi, Kelola cakupan OAuth, dan Buat rahasia aplikasi.
Istilah
Istilah | Deskripsi |
ID token | OIDC dapat menerbitkan ID token pengguna ke suatu aplikasi. ID token dapat digunakan untuk mendapatkan informasi pengguna, seperti username dan nama logon. ID token tidak dapat digunakan untuk mengakses resource Alibaba Cloud. |
OIDC Discovery Endpoint | OIDC menyediakan endpoint yang berbeda untuk tujuan yang berbeda. Discovery Endpoint berisi informasi konfigurasi yang diperlukan oleh OIDC. Catatan Discovery Endpoint menyediakan sekumpulan kunci dalam dokumen JSON. Kunci-kunci tersebut berisi informasi tentang penyedia OIDC, seperti tipe respons yang didukung oleh OIDC, nilai penerbit token, endpoint kunci publik penandatanganan ID token, dan algoritma penandatanganan. Sebagai penyedia OIDC, Alibaba Cloud menyediakan Discovery Endpoint berikut untuk menyederhanakan konfigurasi: Contoh berikut menunjukkan isi Discovery Endpoint: |
Proses

Pengguna masuk ke aplikasi melalui browser.
Aplikasi mengalihkan pengguna ke layanan OIDC Alibaba Cloud dan mengirimkan URL aplikasi ke browser.
CatatanJika pengguna belum masuk ke Alibaba Cloud, aplikasi akan mengalihkannya ke halaman logon Alibaba Cloud.
Pengguna masuk ke layanan OIDC Alibaba Cloud melalui browser dan meminta kode otorisasi.
Layanan OIDC Alibaba Cloud mengembalikan kode otorisasi ke browser.
Aplikasi meminta ID token yang sesuai dengan pengguna dari layanan OIDC Alibaba Cloud, dengan menyertakan kode otorisasi dalam permintaan tersebut.
Layanan OIDC Alibaba Cloud mengembalikan ID token dan access token ke aplikasi. Aplikasi dapat menggunakan salah satu token tersebut untuk mendapatkan informasi pengguna.
Uraikan ID token untuk mendapatkan informasi pengguna.
Aplikasi harus memvalidasi signature ID token dengan memperoleh kunci publik penandatanganan ID token, memverifikasi signature Token Web JSON (JWT), lalu mengekstrak informasi pengguna yang telah diurai. Untuk informasi selengkapnya, lihat Contoh 1: Dapatkan kunci publik penandatanganan ID token, Contoh 2: Verifikasi signature JWT ID token, dan Contoh 3: Uraikan ID token untuk mendapatkan informasi pengguna.
Gunakan ID token untuk berkomunikasi antar modul dalam aplikasi.
Aplikasi harus memvalidasi signature ID token dengan memperoleh kunci publik penandatanganan ID token dan memverifikasi signature JWT ID token. Untuk informasi selengkapnya, lihat Contoh 2: Verifikasi signature JWT ID token.
Gunakan access token untuk melakukan kueri informasi pengguna berulang kali.
Setelah mendapatkan access token, aplikasi memanggil operasi UserInfo untuk mendapatkan informasi pengguna. Untuk informasi selengkapnya, lihat Contoh 4: Dapatkan informasi pengguna dengan menggunakan access token dan operasi UserInfo.
Contoh 1: Dapatkan kunci publik penandatanganan ID token
Permintaan contoh
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 signature JWT ID token
ID token yang diterbitkan oleh Alibaba Cloud merupakan JWT yang ditandatangani menggunakan algoritma RS256 sesuai standar JWS. Saat meminta informasi pengguna, aplikasi harus memvalidasi hal-hal berikut pada ID token:
Signature token: Aplikasi memverifikasi validitas ID token menggunakan kunci publik penandatanganan OAuth yang diperoleh dalam Contoh 1: Dapatkan kunci publik penandatanganan ID token.
Kunci publik OAuth secara rutin mengalami rotasi. Perhatikan hal-hal berikut saat memperoleh kunci publik tersebut:
Jangan cache atau menyimpan kunci publik untuk penggunaan berikutnya. Ambil kunci publik setiap kali melakukan permintaan.
Saat terjadi rotasi kunci publik, beberapa kunci publik yang valid dapat berlaku secara bersamaan. Gunakan semua kunci publik tersebut secara berurutan untuk memverifikasi signature hingga verifikasi berhasil. Jangan membatasi jumlah kunci publik yang digunakan untuk verifikasi.
Permintaan contoh
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");
}Validitas token: Alibaba Cloud memeriksa waktu penerbitan dan periode validitas ID token.
Penerima token: Alibaba Cloud mencegah penggunaan ID token yang diterbitkan untuk aplikasi lain pada aplikasi ini.
Contoh 3: Uraikan ID token untuk mendapatkan informasi pengguna
Parameter respons
Parameter header
Parameter
Deskripsi
Cakupan OAuth yang diperlukan
alg
Algoritma penandatanganan.
openid
kid
Kunci publik yang digunakan untuk memvalidasi ID token. Anda harus menggunakan kunci ini untuk memvalidasi signature dan mencegah ID token Anda dimanipulasi.
openid
Parameter badan
Parameter
Deskripsi
Cakupan OAuth yang diperlukan
exp
Timestamp saat token kedaluwarsa.
openid
sub
String unik yang mengidentifikasi pengguna. String ini tidak berisi UID dan username pengguna.
CatatanJika pengguna mengasumsikan peran Resource Access Management (RAM), nilai parameter sub dihasilkan berdasarkan
<RoleId:RoleSessionName>. Nilainya unik dan dihasilkan untuk setiap pengguna.openid
aud
Penerima token, yaitu ID aplikasi OAuth.
openid
iss
Penerbit token. Nilainya adalah https://oauth.alibabacloud.com.
openid
iat
Timestamp saat token diterbitkan.
openid
type
Tipe pengguna. Nilai yang valid:
account: akun Alibaba Cloud
user: RAM user.
role: RAM role.
profile
name
Nama tampilan pengguna. Nilai yang valid:
Jika menggunakan RAM user, nilainya adalah nama tampilan RAM user tersebut.
Jika menggunakan RAM role, nilainya dalam format
<RoleName:RoleSessionName>.
CatatanParameter ini hanya dikembalikan jika permintaan diajukan oleh RAM user atau RAM role.
profile
upn
Nama logon RAM user.
CatatanParameter ini hanya dikembalikan jika permintaan diajukan oleh RAM user.
profile
login_name
Nama logon akun Alibaba Cloud.
CatatanParameter ini hanya dikembalikan jika permintaan diajukan oleh akun Alibaba Cloud.
profile
aid
ID akun Alibaba Cloud tempat pengguna tersebut berada.
aliuid
uid
ID pengguna. Nilai yang valid:
Jika menggunakan akun Alibaba Cloud, nilainya sama dengan nilai parameter aid.
Jika menggunakan RAM user, nilainya adalah ID RAM user tersebut.
Jika menggunakan RAM role, nilainya adalah ID RAM role tersebut.
aliuid
Respons contoh
Header respons contoh
{ "alg": "RS256", "kid": "JC9wxzrhqJ0gtaCEt2QLUfevEUIwltFhui4O1bh****" }Badan respons contoh
Untuk keperluan demonstrasi, respons contoh berikut menunjukkan ID token sebelum dikodekan. Dalam skenario aktual, ID token yang dikembalikan telah dikodekan. Untuk informasi selengkapnya, lihat Contoh 2: Verifikasi signature JWT ID token.
Badan respons contoh dari permintaan yang diajukan oleh akun Alibaba Cloud
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "account", "login_name":"alice@example.com", //Nama logon akun Alibaba Cloud. "aid": "123456789012****", //ID akun Alibaba Cloud. "uid": "123456789012****" //ID akun Alibaba Cloud. }Contoh badan respons dari permintaan yang diinisiasi oleh Pengguna RAM
{ "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 logon RAM user. "aid": "123456789012****", //ID akun Alibaba Cloud tempat RAM user tersebut berada. "uid": "234567890123****" //ID RAM user. }Badan respons contoh dari permintaan yang diajukan oleh RAM role
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.aliyun.com", "iat": 1517535923, "type": "role", "name": "NetworkAdministrator:alice", // Nama tampilan peran RAM. "aid": "123456789012****", // ID akun Alibaba Cloud tempat peran RAM ini berada. "uid": "300800165472****" // ID peran RAM. }
Contoh 4: Dapatkan informasi pengguna dengan menggunakan access token dan operasi UserInfo
Setelah memperoleh access token, Anda dapat memanggil operasi UserInfo untuk mendapatkan informasi pengguna. Operasi UserInfo hanya dapat dipanggil menggunakan access token, dan respons yang diberikan tidak dikodekan.
Dalam skenario penggunaan OIDC yang sebenarnya, access token tetap dikembalikan meskipun hanya cakupan openid, aliuid, dan profile yang ditentukan. Access token tersebut hanya dapat digunakan untuk memanggil operasi UserInfo.
Endpoint untuk operasi UserInfo adalah: https://oauth.alibabacloud.com/v1/userinfo.
Permintaan contoh
GET v1/userinfo HTTP/1.1
Host: oauth.alibabacloud.com
Authorization: Bearer SIAV32hkKGParameter respons
Parameter | Deskripsi | Cakupan OAuth yang diperlukan |
sub | String unik yang mengidentifikasi pengguna. String ini tidak berisi UID dan username pengguna. | openid |
type | Tipe pengguna. | profile |
name | Nama tampilan pengguna. Catatan Parameter ini hanya dikembalikan jika permintaan diajukan oleh RAM user atau RAM role. | profile |
upn | Nama logon RAM user. Catatan Parameter ini hanya dikembalikan jika permintaan diajukan oleh RAM user. | profile |
login_name | Nama logon akun Alibaba Cloud. Catatan Parameter ini hanya dikembalikan jika permintaan diajukan oleh akun Alibaba Cloud. | profile |
aid | ID akun Alibaba Cloud tempat pengguna tersebut berada. | aliuid |
uid | ID pengguna. | aliuid |
Contoh badan respons
Badan respons contoh dari permintaan yang diajukan oleh akun Alibaba Cloud
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "account", "login_name":"alice@example.com", //Nama logon akun Alibaba Cloud. "aid": "123456789012****", //ID akun Alibaba Cloud. "uid": "123456789012****" //ID akun Alibaba Cloud. }Badan respons contoh dari permintaan yang diajukan oleh 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 logon RAM user. "aid": "123456789012****", //ID akun Alibaba Cloud tempat RAM user tersebut berada. "uid": "234567890123****" //ID RAM user. }Badan respons contoh dari permintaan yang diajukan oleh 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 tersebut berada. "uid": "300800165472****" //ID RAM role. }