日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

通過OIDC獲取用戶信息

更新時(shí)間:

OIDC(OpenID Connect)是建立在OAuth 2.0基礎(chǔ)上的一個(gè)認(rèn)證協(xié)議,本文為您介紹應(yīng)用如何使用OIDC獲取阿里云登錄用戶的信息。

前提條件

獲取用戶登錄信息前,您需要?jiǎng)?chuàng)建應(yīng)用,設(shè)置應(yīng)用名稱、OAuth范圍和回調(diào)地址等關(guān)鍵信息,并為應(yīng)用生成應(yīng)用密鑰。具體操作,請(qǐng)參見創(chuàng)建應(yīng)用添加應(yīng)用范圍創(chuàng)建應(yīng)用密鑰

基本概念

概念

說明

身份令牌

OIDC可以給應(yīng)用下發(fā)代表登錄用戶的身份令牌。身份令牌用于獲取姓名、登錄名等用戶信息,不能用于訪問阿里云服務(wù)。

OIDC Discovery Endpoint

OIDC協(xié)議包含了不同的Endpoint用于不同的目的,Discovery Endpoint中包含OIDC協(xié)議所需要的所有配置信息,方便開發(fā)者使用。

說明

Discovery Endpoint是通過JSON文檔來提供一系列鍵值,其中包含主要的提供者信息,例如:協(xié)議支持的響應(yīng)類型、令牌頒發(fā)者的取值、身份令牌簽名密鑰的地址和簽名算法等。

阿里云作為OIDC服務(wù)提供者,提供了一個(gè)Discovery Endpoint:https://oauth.aliyun.com/.well-known/openid-configuration來簡(jiǎn)化配置流程。

Discovery Endpoint包含的內(nèi)容示例如下:

{
  "code_challenge_methods_supported": [
    "plain",
    "S256"
  ],
  "subject_types_supported": [
    "public"
  ],
  "response_types_supported": [
    "code"
  ],
  "issuer": "https://oauth.aliyun.com",
  "jwks_uri": "https://oauth.aliyun.com/v1/keys",
  "revocation_endpoint": "https://oauth.aliyun.com/v1/revoke",
  "token_endpoint": "https://oauth.aliyun.com/v1/token",
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "scopes_supported": [
    "openid",
    "aliuid",
    "profile"
  ],
  "authorization_endpoint": "https://signin.aliyun.com/oauth2/v1/auth"
}

基本流程

IODC基本流程

  1. 用戶通過瀏覽器登錄應(yīng)用。

  2. 應(yīng)用重定向到阿里云OIDC服務(wù)并將URL返回給瀏覽器。

    說明

    如果用戶還未登錄,則會(huì)進(jìn)一步重定向到阿里云登錄服務(wù)。

  3. 用戶通過瀏覽器登錄阿里云OIDC服務(wù)并申請(qǐng)授權(quán)碼。

  4. 阿里云OIDC服務(wù)重定向到應(yīng)用并返回授權(quán)碼給瀏覽器。

  5. 瀏覽器通過應(yīng)用使用授權(quán)碼向阿里云OIDC服務(wù)申請(qǐng)身份令牌。

  6. 阿里云OIDC服務(wù)向應(yīng)用返回身份令牌和訪問令牌,應(yīng)用通過身份令牌或訪問令牌便可以獲取用戶信息。

    具體的使用場(chǎng)景如下:

示例一:應(yīng)用獲取身份令牌簽名密鑰

請(qǐng)求示例如下:

private List getSignPublicKey() {
  HttpResponse response = HttpClientUtils.doGet("https://oauth.aliyun.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());
}                    

示例二:驗(yàn)證身份令牌的JWT簽名

阿里云頒發(fā)的身份令牌是帶有簽名的JWT(JSON Web Token),簽名算法為JWS標(biāo)準(zhǔn)RS256。當(dāng)應(yīng)用請(qǐng)求獲取用戶信息時(shí),阿里云需要對(duì)身份令牌進(jìn)行驗(yàn)證,包含以下幾個(gè)方面:

  • 簽名驗(yàn)證:通過OAuth服務(wù)公布的簽名公鑰,驗(yàn)證身份令牌的真實(shí)性和完整性。

    請(qǐng)求示例如下:

    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");
    }
  • 有效期驗(yàn)證:檢查令牌頒發(fā)時(shí)間和令牌過期時(shí)間的有效性。

  • 檢查令牌接收者:防止頒發(fā)給其他應(yīng)用的身份令牌被傳遞給本應(yīng)用。

示例三:解析身份令牌獲取用戶信息

  • 返回參數(shù)

    • Header返回參數(shù)

      參數(shù)名稱

      描述

      需要的OAuth范圍

      alg

      簽名算法。

      openid

      kid

      驗(yàn)證身份令牌簽名使用的公鑰,用戶需要使用此公鑰驗(yàn)證簽名,防止身份令牌被篡改。

      openid

    • Body返回參數(shù)

      參數(shù)名稱

      描述

      需要的OAuth范圍

      exp

      令牌過期時(shí)間戳。

      openid

      sub

      唯一代表登錄用戶的字符串,但并不包含阿里云UID、用戶名等信息。

      說明

      當(dāng)?shù)卿浻脩魹镽AM角色時(shí),sub將根據(jù)角色扮演者<RoleId:RoleSessionName>生成,每個(gè)扮演者都有獨(dú)立的sub

      openid

      aud

      令牌接收者,OAuth應(yīng)用ID。

      openid

      iss

      令牌頒發(fā)者。取值為https://oauth.aliyun.com

      openid

      iat

      令牌頒發(fā)時(shí)間戳。

      openid

      type

      登錄用戶類型。取值:

      • account:阿里云賬號(hào)(主賬號(hào))。

      • user:RAM用戶。

      • role:RAM角色。

      profile

      name

      登錄用戶的顯示名稱。取值:

      • RAM用戶:RAM用戶的顯示名稱。

      • RAM角色:<RoleName:RoleSessionName>

      說明

      RAM用戶和RAM角色請(qǐng)求時(shí)才會(huì)返回該參數(shù)。

      profile

      upn

      RAM用戶的登錄名稱。

      說明

      RAM用戶請(qǐng)求時(shí)才會(huì)返回該參數(shù)。

      profile

      login_name

      阿里云賬號(hào)(主賬號(hào))的登錄名稱。

      說明

      阿里云賬號(hào)(主賬號(hào))請(qǐng)求時(shí)才會(huì)返回該參數(shù)。

      profile

      aid

      登錄用戶所屬的阿里云賬號(hào)(主賬號(hào))ID。

      aliuid

      uid

      登錄用戶的ID。取值:

      • 阿里云賬號(hào)(主賬號(hào)):阿里云賬號(hào)(主賬號(hào))ID,與aid相同。

      • RAM用戶:RAM用戶ID。

      • RAM角色:RAM角色I(xiàn)D。

      aliuid

  • 返回示例

    • Header返回示例

      {
        "alg": "RS256",
        "kid": "JC9wxzrhqJ0gtaCEt2QLUfevEUIwltFhui4O1bh****"
      }
    • Body返回示例

      為了閱讀方便,以下展示的是未編碼的身份令牌的返回示例。實(shí)際返回為編碼后的身份令牌,更多信息,請(qǐng)參見示例二:驗(yàn)證身份令牌的JWT簽名

      • 阿里云賬號(hào)請(qǐng)求時(shí)的Body返回示例

        {
          "exp": 1517539523,
          "sub": "123456789012****",
          "aud": "4567890123456****",
          "iss": "https://oauth.aliyun.com", 
          "iat": 1517535923,
          "type": "account",
          "login_name":"alice@example.com", //阿里云賬號(hào)的登錄名稱
          "aid": "123456789012****", //阿里云賬號(hào)ID
          "uid": "123456789012****" //阿里云賬號(hào)ID
        }
      • RAM用戶請(qǐng)求時(shí)的Body返回示例

        {
          "exp": 1517539523,
          "sub": "123456789012****",
          "aud": "4567890123456****",
          "iss": "https://oauth.aliyun.com",
          "iat": 1517535923,
          "type": "user",
          "name": "alice", //RAM用戶的顯示名稱
          "upn": "alice@example.onaliyun.com", //RAM用戶的登錄名稱
          "aid": "123456789012****", //RAM用戶所屬的阿里云賬號(hào)ID
          "uid": "234567890123****" //RAM用戶ID
        }
      • RAM角色請(qǐng)求時(shí)的Body返回示例

        {
          "exp": 1517539523,
          "sub": "123456789012****",
          "aud": "4567890123456****",
          "iss": "https://oauth.alibabacloud.com",
          "iat": 1517535923,
          "type": "role",
          "name": "NetworkAdministrator:alice", //RAM角色的顯示名稱
          "aid": "123456789012****", //RAM角色所屬的阿里云賬號(hào)ID
          "uid": "300800165472****" //RAM角色I(xiàn)D
        }

示例四:通過訪問令牌和UserInfo接口獲取用戶信息

除了直接獲取身份令牌,您也可以在獲取訪問令牌后通過調(diào)用UserInfo接口獲取用戶信息,該接口必須使用訪問令牌才能訪問,返回信息不編碼。

說明

OIDC場(chǎng)景下,即只有openidaliuidprofile這幾個(gè)范圍的時(shí)候,也會(huì)返回訪問令牌,此時(shí)的訪問令牌只能用于調(diào)用UserInfo接口。

UserInfo接口請(qǐng)求地址:https://oauth.aliyun.com/v1/userinfo

請(qǐng)求示例如下:

GET v1/userinfo HTTP/1.1
Host: oauth.aliyun.com
Authorization: Bearer SlAV32hkKG 

返回參數(shù)如下表所示:

參數(shù)名稱

描述

需要的OAuth范圍

sub

唯一代表登錄用戶的字符串,但并不包含阿里云UID、用戶名等信息。

openid

type

登錄用戶類型。

profile

name

登錄用戶的顯示名稱。

說明

RAM用戶和RAM角色請(qǐng)求時(shí)才會(huì)返回該參數(shù)。

profile

upn

RAM用戶的登錄名稱。

說明

RAM用戶請(qǐng)求時(shí)才會(huì)返回該參數(shù)。

profile

login_name

阿里云賬號(hào)(主賬號(hào))的登錄名稱。

說明

阿里云賬號(hào)(主賬號(hào))請(qǐng)求時(shí)才會(huì)返回該參數(shù)。

profile

aid

登錄用戶所屬的阿里云賬號(hào)(主賬號(hào))ID。

aliuid

uid

登錄用戶的ID。

aliuid

Body返回示例如下:

  • 阿里云賬號(hào)請(qǐng)求時(shí)的Body返回示例

    HTTP/1.1 200 OK
    Content-Type: application/json
    {
      "sub": "123456789012****", 
      "type": "account",
      "login_name":"alice@example.com", //阿里云賬號(hào)的登錄名稱
      "aid": "123456789012****", //阿里云賬號(hào)ID
      "uid": "123456789012****" //阿里云賬號(hào)ID
    }
  • RAM用戶請(qǐng)求時(shí)的Body返回示例

    HTTP/1.1 200 OK
    Content-Type: application/json
    {
      "sub": "123456789012****", 
      "type": "user",  
      "name": "alice", //RAM用戶的顯示名稱
      "upn": "alice@example.onaliyun.com", //RAM用戶的登錄名稱
      "aid": "123456789012****", //RAM用戶所屬的阿里云賬號(hào)ID
      "uid": "234567890123****" //RAM用戶ID
    }
  • RAM角色請(qǐng)求時(shí)的Body返回示例

    HTTP/1.1 200 OK
    Content-Type: application/json
    {
      "sub": "123456789012****", 
      "type": "role",
      "name": "NetworkAdministrator:alice", //RAM角色的顯示名稱
      "aid": "123456789012****", //RAM角色所屬的阿里云賬號(hào)ID
      "uid": "300800165472****" //RAM角色I(xiàn)D
    }