OpenID Connect (OIDC) adalah lapisan protokol otentikasi yang dibangun di atas protokol Open Authorization (OAuth) 2.0. Topik ini menjelaskan cara memperoleh informasi pengguna menggunakan OIDC.
Prasyarat
Aplikasi web telah dibuat, dengan nama, ruang lingkup OAuth, dan URL panggilan balik yang telah ditentukan. Rahasia aplikasi juga telah dibuat. Untuk informasi lebih lanjut, lihat Buat Aplikasi, Tambahkan Ruang Lingkup OAuth, dan Buat Rahasia Aplikasi.
Istilah
Istilah | Deskripsi |
Token ID | OIDC dapat menerbitkan token ID pengguna ke aplikasi. Token ID dapat digunakan untuk memperoleh informasi pengguna, seperti nama pengguna dan nama masuk. Token ID tidak dapat digunakan untuk mengakses sumber daya Alibaba Cloud. |
Titik akhir Penemuan OIDC | OIDC menyediakan titik akhir yang berbeda untuk tujuan yang berbeda. Titik Akhir Penemuan berisi informasi konfigurasi yang diperlukan oleh OIDC. Catatan Titik Akhir Penemuan menyediakan satu set kunci dalam dokumen JSON. Kunci-kunci tersebut berisi informasi tentang penyedia OIDC, seperti tipe respons yang didukung oleh OIDC, nilai penerbit token, titik akhir kunci publik penandatanganan token ID, dan algoritma penandatanganan. Sebagai penyedia OIDC, Alibaba Cloud menyediakan Titik Akhir Penemuan berikut untuk menyederhanakan konfigurasi: Berikut adalah contoh isi dari Titik Akhir Penemuan: |
Proses

Pengguna masuk ke aplikasi melalui browser.
Aplikasi mengarahkan pengguna ke layanan OIDC Alibaba Cloud dan mengirimkan URL aplikasi ke browser.
CatatanJika pengguna belum masuk ke Alibaba Cloud, aplikasi akan mengarahkan pengguna ke halaman masuk 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 token ID yang sesuai dengan pengguna dari layanan OIDC Alibaba Cloud. Kode otorisasi diperlukan dalam permintaan ini.
Layanan OIDC Alibaba Cloud mengembalikan token ID dan token akses ke aplikasi. Aplikasi dapat menggunakan token ID atau token akses untuk memperoleh informasi pengguna.
Parsel token ID untuk memperoleh informasi pengguna.
Aplikasi harus memvalidasi tanda tangan token ID. Aplikasi memperoleh kunci publik penandatanganan token ID, memverifikasi tanda tangan JSON Web Token (JWT) dari token ID, dan kemudian mendapatkan informasi pengguna yang telah diurai. Untuk informasi lebih lanjut, lihat Contoh 1: Memperoleh Kunci Publik Penandatanganan Token ID, Contoh 2: Verifikasi Tanda Tangan JWT dari Token ID, dan Contoh 3: Parsel Token ID untuk Memperoleh Informasi Pengguna.
Gunakan token ID untuk berkomunikasi dengan modul-modul aplikasi yang berbeda.
Aplikasi harus memvalidasi tanda tangan token ID. Aplikasi memperoleh kunci publik penandatanganan token ID dan memverifikasi tanda tangan JWT dari token ID. Untuk informasi lebih lanjut, lihat Contoh 1: Memperoleh Kunci Publik Penandatanganan Token ID dan Contoh 2: Verifikasi Tanda Tangan JWT dari Token ID.
Gunakan token akses untuk menanyakan informasi pengguna beberapa kali.
Setelah aplikasi memperoleh token akses, aplikasi memanggil operasi UserInfo untuk memperoleh informasi pengguna. Untuk informasi lebih lanjut, lihat Contoh 4: Memperoleh Informasi Pengguna Menggunakan Token Akses dan Operasi UserInfo.
Contoh 1: Memperoleh kunci publik penandatanganan token ID
Permintaan Sampel
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 dari token ID
Token ID yang diterbitkan oleh Alibaba Cloud adalah JSON Web Token (JWT) yang ditandatangani. Algoritma penandatanganan RS256 yang sesuai dengan standar JWS digunakan. Saat aplikasi meminta informasi pengguna, aplikasi harus memvalidasi konten berikut dari token ID:
Tanda tangan token: Aplikasi memeriksa apakah token ID valid dengan menggunakan kunci publik OAuth yang diterbitkan dalam Contoh 1: Memperoleh Kunci Publik Penandatanganan Token ID.
Kunci publik OAuth secara teratur diputar. Perhatikan poin-poin berikut saat Anda memperoleh kunci publik tersebut:
Jangan menyimpan cache atau menyimpan kunci publik untuk digunakan nanti. Peroleh kunci publik untuk setiap permintaan.
Selama pemutaran kunci publik, beberapa kunci publik valid ada. Semua kunci publik harus digunakan untuk memverifikasi tanda tangan secara berurutan hingga verifikasi tanda tangan berhasil. Jangan tentukan jumlah kunci publik yang dapat digunakan untuk memverifikasi tanda tangan.
Permintaan Sampel
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 ketika token ID diterbitkan dan periode validitas token ID.
Penerima token: Alibaba Cloud mencegah token ID yang diterbitkan untuk aplikasi lain diterbitkan ke aplikasi tersebut.
Contoh 3: Parsel token ID untuk memperoleh informasi pengguna
Parameter Respons
Parameter Header
Parameter
Deskripsi
Ruang lingkup OAuth yang diperlukan
alg
Algoritma penandatanganan.
openid
kid
Kunci publik yang digunakan untuk memvalidasi token ID. Anda harus menggunakan kunci ini untuk memvalidasi tanda tangan Anda dan mencegah token ID Anda dirusak.
openid
Parameter Body
Parameter
Deskripsi
Ruang lingkup OAuth yang diperlukan
exp
Timestamp ketika token kedaluwarsa.
openid
sub
String unik yang menunjukkan pengguna. String ini tidak berisi UID dan nama pengguna.
CatatanJika pengguna mengasumsikan Peran RAM, nilai parameter sub dibuat berdasarkan
<RoleId:RoleSessionName>. Nilainya unik dan dibuat untuk setiap pengguna.openid
aud
Penerima token, yaitu ID aplikasi OAuth.
openid
iss
Penerbit token. Nilainya adalah https://oauth.alibabacloud.com.
openid
iat
Timestamp ketika token diterbitkan.
openid
type
Tipe pengguna. Nilai yang valid:
account: akun Alibaba Cloud
user: pengguna RAM.
role: peran RAM.
profile
name
Nama tampilan pengguna. Nilai yang valid:
Jika pengguna RAM digunakan, nilainya adalah nama tampilan pengguna RAM.
Jika peran RAM digunakan, nilainya dalam format
<RoleName:RoleSessionName>.
CatatanParameter ini hanya dikembalikan jika pengguna RAM atau peran RAM memulai permintaan.
profile
upn
Nama masuk pengguna RAM.
CatatanParameter ini hanya dikembalikan jika pengguna RAM memulai permintaan.
profile
login_name
Nama masuk akun Alibaba Cloud.
CatatanParameter ini hanya dikembalikan jika akun Alibaba Cloud memulai permintaan.
profile
aid
ID akun Alibaba Cloud tempat pengguna tersebut berasal.
aliuid
uid
ID pengguna. Nilai yang valid:
Jika akun Alibaba Cloud digunakan, nilainya sama dengan nilai parameter aid.
Jika pengguna RAM digunakan, nilainya adalah ID pengguna RAM.
Jika peran RAM digunakan, nilainya adalah ID peran RAM.
aliuid
Respons Sampel
Header Respons Sampel
{ "alg": "RS256", "kid": "JC9wxzrhqJ0gtaCEt2QLUfevEUIwltFhui4O1bh****" }Body Respons Sampel
Untuk tujuan demonstrasi, respons sampel berikut menunjukkan token ID sebelum pengkodean. Dalam skenario nyata, token ID yang dikodekan dikembalikan. Untuk informasi lebih lanjut, lihat Contoh 2: Verifikasi Tanda Tangan JWT dari Token ID.
Body Respons Sampel dari Permintaan yang Dimulai oleh Akun Alibaba Cloud
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "account", "login_name":"alice@example.com", //The logon name of the Alibaba Cloud account. "aid": "123456789012****", //The ID of the Alibaba Cloud account. "uid": "123456789012****" //The ID of the Alibaba Cloud account. }Body Respons Sampel dari Permintaan yang Dimulai oleh Pengguna RAM
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.alibabacloud.com", "iat": 1517535923, "type": "user", "name": "alice", //The display name of the RAM user. "upn": "alice@example.onaliyun.com", //The logon name of the RAM user. "aid": "123456789012****", //The ID of the Alibaba Cloud account to which the RAM user belongs. "uid": "234567890123****" //The ID of the RAM user. }Body Respons Sampel dari Permintaan yang Dimulai oleh Peran RAM
{ "exp": 1517539523, "sub": "123456789012****", "aud": "4567890123456****", "iss": "https://oauth.aliyun.com", "iat": 1517535923, "type": "role", "name": "NetworkAdministrator:alice", //The display name of the RAM role. "aid": "123456789012****", //The ID of the Alibaba Cloud account to which the RAM role belongs. "uid": "300800165472****" //The ID of the RAM role. }
Contoh 4: Memperoleh informasi pengguna menggunakan token akses dan operasi UserInfo
Setelah Anda memperoleh token akses, Anda dapat memanggil operasi UserInfo untuk memperoleh informasi pengguna. Operasi UserInfo hanya dapat dipanggil menggunakan token akses, dan informasi respons tidak dienkripsi.
Dalam skenario penggunaan OIDC yang sebenarnya, token akses dapat dikembalikan meskipun hanya ruang lingkup openid, aliuid, dan profile yang ditentukan. Token akses yang dikembalikan hanya dapat digunakan untuk memanggil operasi UserInfo.
Titik akhir untuk operasi UserInfo adalah: https://oauth.alibabacloud.com/v1/userinfo.
Permintaan Sampel
GET v1/userinfo HTTP/1.1
Host: oauth.alibabacloud.com
Authorization: Bearer SIAV32hkKGParameter Respons
Parameter | Deskripsi | Ruang lingkup OAuth yang diperlukan |
sub | String unik yang menunjukkan pengguna. String ini tidak berisi UID dan nama pengguna. | openid |
type | Tipe pengguna. | profile |
name | Nama tampilan pengguna. Catatan Parameter ini hanya dikembalikan jika pengguna RAM atau peran RAM memulai permintaan. | profile |
upn | Nama masuk pengguna RAM. Catatan Parameter ini hanya dikembalikan jika pengguna RAM memulai permintaan. | profile |
login_name | Nama masuk akun Alibaba Cloud. Catatan Parameter ini hanya dikembalikan jika akun Alibaba Cloud memulai permintaan. | profile |
aid | ID akun Alibaba Cloud tempat pengguna tersebut berasal. | aliuid |
uid | ID pengguna. | aliuid |
Body Respons Sampel
Body Respons Sampel dari Permintaan yang Dimulai oleh Akun Alibaba Cloud
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "account", "login_name":"alice@example.com", //Nama masuk akun Alibaba Cloud. "aid": "123456789012****", //ID akun Alibaba Cloud. "uid": "123456789012****" //ID akun Alibaba Cloud. }Body Respons Sampel dari Permintaan yang Dimulai oleh Pengguna RAM
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "user", "name": "alice", //Nama tampilan pengguna RAM. "upn": "alice@example.onaliyun.com", //Nama masuk pengguna RAM. "aid": "123456789012****", //ID akun Alibaba Cloud tempat pengguna RAM berasal. "uid": "234567890123****" //ID pengguna RAM. }Body Respons Sampel dari Permintaan yang Dimulai oleh Peran RAM
HTTP/1.1 200 OK Content-Type: application/json { "sub": "123456789012****", "type": "role", "name": "NetworkAdministrator:alice", //Nama tampilan peran RAM. "aid": "123456789012****", //ID akun Alibaba Cloud tempat peran RAM berasal. "uid": "300800165472****" //ID peran RAM. }