IDaaS, özel uygulamalarınız için tek oturum açma (SSO) özelliğini uygulamak üzere OpenID Connect (OIDC) yetkilendirme kodu akışını kullanır. Uygulamanız, tam SSO akışını tamamlamak için iki uç nokta ile etkileşime girer: yetkilendirme uç noktası ve belirteç uç noktası. Kimlik doğrulama sürecinin tamamı IDaaS tarafından yönetilir; uygulamanızın yalnızca sonucu işlemesi gerekir.
Çalışma Mantığı
Aşağıdaki adımlar, uygulamanız, kullanıcının tarayıcısı ve IDaaS arasındaki OIDC yetkilendirme kodu akışını özetler:
Uygulamanız tarayıcıyı IDaaS yetkilendirme uç noktasına yönlendirir.
IDaaS oturum açma sayfasını görüntüler. Kullanıcı kimliğini doğrular.
IDaaS, tarayıcıyı bir yetkilendirme
codeile birlikteredirect_uriadresinize geri yönlendirir.Uygulamanız, IDaaS belirteç uç noktasını çağırarak
codedeğerini belirteçlerle değiştirir.Uygulamanız ID Belirtecini doğrular ve kullanıcının oturumunu oluşturur.
OIDC 1.0, OAuth 2.0'ın üzerine bir kullanıcı kimliği katmanı ekler ve OAuth 2.0 yetkilendirme kodu akışıyla geriye dönük olarak uyumludur. Temel fark, belirteç uç noktasının kullanıcı kimliği taleplerini içeren bir ID Belirteci de döndürmesidir.
Ön Koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Bir IDaaS örneği
IDaaS içinde oluşturulmuş özel bir uygulama veya OIDC tabanlı bir uygulama (bkz. Özel uygulamalar)
Uygulamanız için
client_idveclient_secretdeğerleri (Applications sayfasının General sekmesinde bulunur)
OIDC ile SSO Entegrasyonu
1. Adım: Uygulama kimlik bilgilerinizi alın
Applications sayfasında uygulamanızı tıklayın ve General sekmesini açın. client_id ve client_secret değerlerini not edin; bu değerler sonraki tüm API istekleri için gereklidir.
Kimlik bilgilerini döndürmek veya yönetmek için bkz. Genel yapılandırmalar.
2. Adım: Yetkilendirme uç noktasına istek gönderin
Bir kullanıcı etkin oturumu olmadan uygulamanıza eriştiğinde, tarayıcıyı aşağıdaki parametrelerle IDaaS yetkilendirme uç noktasına yönlendirin.
Yetkilendirme uç noktası URL'sini Applications sayfasında bulabilirsiniz: Uygulamanızı tıklayın, Sign-In sekmesini açın ve Application Settings bölümüne bakın.
Yönlendirme URL'sini aşağıdaki gibi oluşturun:
{{Authorization Endpoint}}?
client_id=app_***&
redirect_uri=http%3A%2F%2Flocalhost%3A3000%2F***&
response_type=code&
scope=openid&
state=525f49cc-***
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
IDaaS uygulamanıza geri yönlendirdiğinde state değerini her zaman doğrulayın. Döndürülen state değerinin gönderdiğiniz değerle eşleşmediği yanıtları reddedin.
3. Adım: Oturum açma geri aramasını işleyin
Kullanıcı kimliğini doğruladıktan sonra IDaaS, redirect_uri adresinize 302 yönlendirmesi gerçekleştirir:
{{redirect_uri}}?
code=CO***&
state=525f49cc-***
|
|
|
|
|
|
|
|
|
|
|
|
IDaaS, DingTalk QR kodu ve SMS dahil olmak üzere birden çok kimlik doğrulama yöntemini destekler. Tam liste için bkz. Genel yapılandırma.
4. Adım: Yetkilendirme kodunu belirteçlerle değiştirin
state değerini doğruladıktan sonra, belirteç uç noktasına bir POST isteği göndererek yetkilendirme kodunu belirteçlerle değiştirin. Belirteç uç noktası URL'sini, yetkilendirme uç noktasıyla aynı Application Settings bölümünde bulabilirsiniz.
POST /v2/<instance_id>/<app_id>/oauth2/token HTTP/1.0
Host: eiam-api-cn-hangzhou.aliyuncs.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&code=n0esc3N*****5acc3f0ogp4
&client_id=s6BhdR*****kqt3
&client_secret=7Fjfp0ZBr1*****KtDRbnfVdmIw
&redirect_uri=http%3A%2F%2Fwww.example.com%2Fsso%2Fcallback
Başarılı bir yanıt hem bir erişim belirteci hem de bir ID Belirteci içerir:
{
"token_type": "Bearer",
"access_token": "ATM4SoVDqWgUq***********wk3ZS5mtn6fcSp8NH8",
"expires_in": 1200,
"expires_at": 1644843164,
"id_token": "eyJraWQiOiJLRVkyV************gRIadj-frOIRFChA"
}
Belirteçlerde kullanılabilen kullanıcı nitelikleri, 2. Adımda talep ettiğiniz scope değerlerine göre belirlenir.
Kullanıcının oturumunu oluşturmak için aşağıdaki yaklaşımlardan birini kullanın:
ID Belirtecini Ayrıştırın —
id_tokenJWT'sini kodunu çözün ve doğrulayın, ardından kullanıcı kimliğini taleplerinden çıkarın. Bkz. 5. Adım: ID Belirtecini ayrıştırın ve doğrulayın.UserInfo uç noktasını çağırın — Kullanıcı niteliklerini almak için
access_tokenkullanarak UserInfo uç noktasını çağırın. Bkz. 6. Adım: UserInfo uç noktasından kullanıcı bilgilerini alın.
5. Adım: ID Belirtecini ayrıştırın ve doğrulayın
ID Belirteci, RS256 ile imzalanmış bir JSON Web Token'dır (JWT). Düz metin olarak kullanıcı kimliği talepleri ve içeriğe güvenmeden önce doğrulamanız gereken bir İmza içerir.
İmza doğrulaması zorunludur. İmzasını önceden doğrulamadan bir ID Belirtecindeki talepleri kullanmayın.
Ham belirteç yapısını incelemek için id_token değerini jwt.io adresine yapıştırın. Kodu çözülmüş bir belirteç şu şekilde görünür:
{
"kid": "KEY2Ty1qL6u21NGKmccv3jwfd2ndmgtQPnag",
"alg": "RS256"
}.{
"sub": "user_uyvefotjn7kpbejfmxoos3rtmm",
"jti": "jwt_aaaac7xyhclac6aqkgtjaxsthw5yotn5d77pmki",
"iss": "https://pre-eiam-api-cn-hangzhou.aliyun-inc.com/v2/********/oidc",
"iat": 1644841965,
"nbf": 1644841965,
"exp": 1644842265,
"aud": "app_mhylgo3iairjqjdx5eop6uaf34",
"at_hash": "XHEaGpMooM9zvQXaMzCNEA",
"name": "testuser",
"preferred_username": "testuser"
}.[Signature]
İmza doğrulaması için genel anahtarı alın
İmzayı doğrulamadan önce IDaaS'tan JSON Web Key (JWK) genel anahtarını alın. Genel anahtar uç noktası URL'sini Application Settings bölümünde (diğer uç noktalarla aynı konumda) bulabilirsiniz.
Uç noktayı çağırmak bir anahtar kümesi döndürür:
{
"keys": [
{
"kty": "RSA",
"e": "AQAB",
"use": "sig",
"kid": "KEYkYnc55G********CTvT7So44RGDYdbfs",
"n": "pXmYkIpy1vaNjTMclU86BQjfmDhjlqMAX8ySVvh9gO-nae4ayvG_*********-v4gP27T7u6bUy0GXTlh3eKE0v1LYB81nfqjF2uazlPwPR5yYOhhWcK-gMNByLfE3CnkDc1YGwA3dZmIz-ZjOCKy8xLaBuqjrvwn5tpMpAoYEEaH4jIm7unTdhbKEKspNR-UXKD8q9RppMh5Tn2sB6oPHlQANudJDgqSwEOevIrdmHU0Zqxrb9cscGH9hH0QjmYEu72yI8BVeliPo3jK6JIoqCIcj5K_t8BJlFQ9QLJ8_o9tmd3BFv5_LVsh4BKGw"
}
]
}
İmzayı doğrulayın
ID Belirtecini ayrıştırmak ve doğrulamak için jwt.io kitaplık listesinden bir JWT kitaplığı kullanın. Aşağıdaki örnek, Java kitaplığı org.bitbucket.b_c:jose4j kullanır.
Maven bağımlılığını ekleyin:
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
<version>0.7.12</version>
</dependency>
Çalıştırmadan önce issuer, appId, jwkJson ve jwt değerlerini IDaaS uygulamanızdaki gerçek değerlerle değiştirin:
import org.jose4j.jwk.JsonWebKey;
import org.jose4j.jwk.JsonWebKeySet;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.consumer.JwtConsumer;
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
public class IdTokenTest {
public static void main(String[] args) throws Exception {
// EIAM's Issuer identifier (OIDC issuer URL)
String issuer = "https://eiam-api-cn-hangzhou.aliyuncs.com/v2/idaas_padyrlux3mphrlsex4uonyqhxu/**********/oidc";
// The unique identifier of the current application (obtained from EIAM)
String appId = "app_mkif4*****pxpzbasqmu";
// Application public key in JSON format, used to verify the JWT signature
String jwkJson = "{\n" + " \"keys\": [\n" + " {\n" + " \"kty\": \"RSA\",\n" + " \"e\": \"AQAB\",\n" + " \"use\": \"sig\",\n" + " \"kid\": \"KEY2H82C2at57itnW4onT3p1ySjwH4nirjCk\",\n" + " \"n\": \"w7Jl3fAUJp_9GuxV*****QsOA4lnXR5OD4kF4QbIeBiDiH8_MThrFi9k2MB6YMkSzf5JfIkpAS3JCqZ7k6Wooydp4pzaZNZAk3SGzdsa022RmAT" + "-Iayi4Yj6J9tSdTQCjwh2XkzzsIxA_Hla8rWiQ8Vhw1" +
"-7QArgObfe67nSR7LxD55MFLxk9FU0*****RlGhrQGE_0LUuGWtCJG1r1e6aKquyswfxxAr3Rvj8QGIeJrG0R1Pv8m8d1_5OdULhB7149VqjM6D98WFjab0U2SNv0UlREZXTcS4p-2QNm_1egYRRpJEY_00FZqNSYsmErMGepYhO_61KoGqd8cphWQ\"\n" + " }\n" + " ]\n" + "}";
String jwt = "eyJraWQiOiJLRVkySDgyQzJhdD*****uaXJqQ2siLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c2Vy*****lmNjRjZjR3amFrbnBieGpjd3V1IiwianRpIjoiand0X2FhYWFkYWllYTc2eWg1cW0zcm11bnoyeGg0eHd5aTJzZHBoNjR6aSIsImlzcyI6Imh0dHBzOi8vZWlhbS1hcGktY24taGFuZ3pob3UuYWxpeXVuY3MuY29tL3YyL2lkYWFzX3BhZHlybHV4M21waHJsc2V4NHVvbnlxaHh1L2FwcF9ta2lmNGR3bHBlaDZkbnM0cHhwemJhc3FtdS9vaWRjIiwiaWF0IjoxNjUzNjMwMDQxLCJuYmYiOjE2NTM2MzAwNDEsImV4cCI6MTY1MzYzMDM0MSwiYXVkIjoiYXBwX21raWY0ZHdscGVoNmRuczRweHB6YmFzcW11IiwibmFtZSI6InRlc3QiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJ0ZXN0IiwidXBkYXRlZF9hdCI6MTY1MzYyODU5MH0.pAsUNB8OkdpIxJMZRfLJ7Pa31tsJyl44a1jVIlvdQxwOtPULAwrFxnB0X3eQx89hUGCdvYWl9FO9o-5kT7L-RER0wJYz9YNKqrVNBnaRwINRZyeYLRVurWMMzODQz-V0ULd9raM1M_i2f_SoWFs1gPFtYh_ijUARHISi7Q3q93ZfAuY8Lq2Nq07QunmDbosvioUd5wJG7WCxW5XXZYDUQe9p5IEYd1MSvnWuTOLbg7rKn0Vm4dNYGWjz1WuoAyCsc_QxOCqpmQ_2czoqPeN-SvPJAQ2CykLk7DSnGpABw1aNrjDidLS9Beqsga9VDCth86sk_0lyTZOaORtUrfVTtQ";
// Parse JWK public key set
JsonWebKeySet jsonWebKeySet = new JsonWebKeySet(jwkJson);
// Create JWT validator
JwtConsumer jwtConsumer = createJwtConsumer(jsonWebKeySet, issuer, appId);
// Execute signature verification and parse claims
JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt);
// Prints the user information from the ID Token
System.out.println(jwtClaims);
}
public static JwtConsumer createJwtConsumer(JsonWebKeySet jsonWebKeySet, String issuer, String appId) {
// Configure JWT validator using builder pattern
final JwtConsumerBuilder jwtConsumerBuilder = new JwtConsumerBuilder();
jwtConsumerBuilder.setExpectedIssuer(issuer);
jwtConsumerBuilder.setRequireIssuedAt();
jwtConsumerBuilder.setRequireExpirationTime();
jwtConsumerBuilder.setAllowedClockSkewInSeconds(60);
jwtConsumerBuilder.setExpectedAudience(appId);
// Set public key resolver (match JWK by kid)
jwtConsumerBuilder.setVerificationKeyResolver((jws, nestingContext) -> {
// Get kid from JWT header
final String signKeyId = jws.getKeyIdHeaderValue();
// Find the matching key in the JWK set
for (JsonWebKey jsonWebKey : jsonWebKeySet.getJsonWebKeys()) {
if (signKeyId.equals(jsonWebKey.getKeyId())) {
return jsonWebKey.getKey();
}
}
throw new RuntimeException("Cannot find verification key: " + signKeyId);
});
return jwtConsumerBuilder.build();
}
}
Başarılı bir çalıştırma, doğrulanmış talepleri çıktılar:
JWT Claims Set:{sub=user_dt6kj6yf64cf4wjaknpbxjcwuu,
jti=jwt_aaaadaiea76yh5qm3rmunz2xh4xwyi2sdph64zi,
iss=https://eiam-api-cn-hangzhou.aliyuncs.com/v2/idaas_padyrlux3mphrlsex4uonyqhxu/app_**********/oidc,
iat=1653630041,
nbf=1653630041,
exp=1653630341,
aud=app_**********,
name=test,
preferred_username=test,
updated_at=1653628590
}
6. Adım: UserInfo uç noktasından kullanıcı bilgilerini alın
ID Belirtecini ayrıştırmaya alternatif olarak, erişim belirtecini kullanarak UserInfo uç noktasını çağırın. Uç nokta, RFC6750 standardını izler.
UserInfo uç noktası URL'sini Application Settings bölümünde bulabilirsiniz.
GET /v2/<instance_id>/<app_id>/oauth2/userinfo HTTP/1.0
Host: eiam-api-cn-hangzhou.aliyuncs.com
Authorization: Bearer <AccessToken>
Örnek yanıt:
{
"sub": "user_dt6kj6yf64cf4wjaknpbxjcwuu",
"name": "test",
"preferred_username": "test",
"updated_at": 1653899948
}
UserInfo uç noktası, uygulama için yapılandırılan genişletilmiş talepler dahil olmak üzere ID Belirteciyle aynı alanları döndürür.
Gelişmiş Ayarlar
OIDC keşif uç noktası
IDaaS, OpenID Connect Discovery 1.0 standardını destekler. Bir uygulama için Yayıncı URL'si aşağıdaki biçimi kullanır:
https://<idaas-api-domain>/v2/<instance_id>/<application_id>/oidc
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Keşif uç noktasını almak için Yayıncı URL'sine /.well-known/openid-configuration ekleyin. Çağrıldığında tüm mevcut uç noktaları döndürür:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Tüm uç nokta URL'lerine doğrudan Application Settings bölümünden de erişilebilir.
Kapsam ve alan eşlemesi
Aşağıdaki tabloda, her bir scope değeri için hangi ID Belirteci taleplerinin döndürüldüğü gösterilmektedir.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Belirteç uç noktası kimlik doğrulama yöntemleri
IDaaS, keşif uç noktasının token_endpoint_auth_methods_supported alanında belirtildiği gibi belirteç uç noktası için dört kimlik doğrulama yöntemini destekler.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Aşağıdaki örnek, client_secret_basic kullanan bir belirteç uç noktası isteğini gösterir:
POST /token HTTP/1.0
Host: api.aliyunidaas.com
Authorization: Basic YXBwX21pY2hzN3I0*******cHllOkNTKioqKioq
grant_type=authorization_code&
code=COE59pkCTm4J*******arGEaiShj7NCzLCYu9
İstemci gizli anahtarı döndürme
Bkz. Genel yapılandırmalar içindeki gizli anahtar döndürme bölümü.
Sonraki Adımlar
Temel OIDC entegrasyonunu tamamladıktan sonra şunları yapmak isteyebilirsiniz:
Oturum açma deneyimini özelleştirin — Genel yapılandırma içinde kimlik doğrulama yöntemlerini ve marka ayarlarını yapılandırın.
Uygulama kimlik bilgilerini yönetin — Genel yapılandırmalar içinde istemci gizli anahtarınızı döndürün veya güncelleyin.