
# 基于OIDC协议的信任委托SSO概述
设想您正在开发一个访问华为云资源的应用程序，例如使用GitHub Actions工作流来访问华为云OBS服务和GaussDB。在使用这些工作流时，您需要向华为云服务发起请求，而这些请求必须使用华为云访问密钥进行签名。然而，我们强烈建议不要在华为云之外的应用程序中长期存储华为云凭证。相反，应将应用程序配置为在需要时通过OIDC身份提供商动态请求临时的华为云安全凭证。这些临时凭证会映射到一个华为云信任委托，该信任委托仅具备执行应用程序所需任务的最小权限。
通过OIDC身份提供商，您无需编写自定义登录代码或自行管理用户身份。您可以在应用程序中使用OIDC（例如GitHub Actions或任何兼容OIDC的身份提供商）来与华为云进行身份验证。应用程序会获取一个OIDC令牌，然后用该令牌在华为云中交换临时安全凭证，这些凭证会映射到一个 IAM 信任委托，从而获得访问您华为云账号中特定资源的权限。使用身份提供商有助于提升华为云账号的安全性，因为您无需在应用中嵌入或分发长期有效的安全凭证。
OIDC身份提供商同时支持机器到机器的身份验证（例如 CI/CD 流水线、自动化脚本和无服务器应用）以及用户身份验证。
#### 使用基于OIDC协议的SSO对华为云进行API访问
通过OIDC身份提供商，您可以让外部身份提供商中的应用安全访问华为云资源，而无需在应用中存储长期访问凭证。基于OIDC的联邦身份认证流程可分为IAM侧配置和访问流程两个阶段。
- **IAM侧配置**
  如下图所示，管理员在IAM侧完成与外部身份提供商的信任建立及权限配置。
  图1在IAM侧配置身份提供商和信任委托   
  ![](https://support.huaweicloud.com/usermanual-iam5/zh-cn_image_0000002555604656.png "点击放大")
  主要步骤包括：
  1. 创建IAM OIDC身份提供商，用于接入外部身份系统；
  
  2. 创建IAM信任委托，建立与身份提供商之间的信任关系；
  
  3. 为信任委托配置身份策略，定义可被授予的资源权限范围。
   
  通过上述配置，云平台完成对外部身份的信任初始化，为后续基于OIDC的访问控制提供基础。
  
- **访问流程**
  如下图所示，用户通过联邦身份访问云资源的流程如下：
  图2访问流程   
  ![](https://support.huaweicloud.com/usermanual-iam5/zh-cn_image_0000002640971650.png "点击放大")
  1. 发起认证：通过客户端应用程序向身份提供商发起身份认证请求。
  
  2. 用户身份验证：身份提供商基于组织的身份存储库对用户进行身份验证。
  
  3. 签发OIDC令牌（ID Token）：验证成功后，外部身份提供商生成包含用户身份信息的OIDC令牌，并返回给客户端应用程序。（具体交互流程取决于所使用的授权模式，例如不同的Grant Type）
  
  4. 调用STS接口：客户端应用程序调用STS的AssumeAgencyWithOIDC接口，并传入IAM OIDC身份提供商URN、信任委托URN、Session Name以及从身份提供商获取的OIDC令牌。
  
  5. OIDC令牌校验：STS根据已配置的OIDC URL获取/.well-known/openid-configuration，解析其中的jwks_uri，并获取对应的JWK公钥，对OIDC令牌的签名及有效性进行校验。
  
  6. 返回临时凭证：校验通过后，STS向客户端应用程序返回临时安全凭证（Access Key / Secret Key / Security Token）。
  
  7. 访问云资源：客户端应用程序使用临时安全凭证调用云服务 API，例如访问Object Storage Service（OBS）执行桶或对象相关操作。
  
  
  ![](https://support.huaweicloud.com/usermanual-iam5/public_sys-resources/note_3.0-zh-cn.png)
  由OIDC身份提供商签发的JSON Web Token（JWT）在其exp声明中包含一个过期时间，用于指明令牌何时失效。IAM根据OIDC Core 1.0标准的允许，为该过期时间提供了一个额外的5分钟宽限窗口，以应对时钟偏差（clock skew）。 这意味着，即使IAM在JWT标明的过期时间之后收到该令牌，只要仍处于这额外的5分钟窗口内，令牌仍会被接受并继续进行评估和处理。
  
 
#### 用于OIDC联邦身份认证访问华为云资源的信任委托概述
您在IAM中创建的信任委托将确定您组织中的OIDC身份提供商主体在华为云中允许执行的操作。当您为信任委托创建信任策略时，您可以将先前创建的IAM身份提供商指定为信任主体。此外，您还可以使用Condition设置信任策略的条件，以便仅允许与特定OIDC属性匹配的用户切换信任委托。
```
{
    "Version": "5.0",
    "Statement": [
        {
            "Action": [
                "sts:agencies:assumeWithOIDC"
            ],
            "Effect": "Allow",
            "Principal": {
                "Federated": [
                    "iam::{account-id}:oidcProvider:{provider-name}"
                ]
            },
            "Condition": {
                "StringEquals": {
                    "oidc:iss": [
                        "https://accounts.example-idp.com"
                    ],
                    "oidc:aud": [
                        "my-backend-service"
                    ],
                    "oidc:sub": [
                        "550e8400-e29b-41d4-a716-446655440000"
                    ]
                }
            }
        }
    ]
}
```
oidc:iss条件键用于验证发行者（Issuer）是否与您在信任策略中指定的内容匹配。对应OIDC令牌中的iss字段，是OIDC身份提供商发布者的URL。
oidc:aud条件键用于验证audience（受众）是否与您在信任策略中指定的内容匹配。
oidc:sub条件键用于验证subject（主体标识）是否与您在信任策略中指定的内容匹配。对应于OIDC令牌中的sub字段，是OIDC身份提供商范围内用户的唯一标识符。
通过以上配置，华为云可以基于OIDC令牌完成身份校验，并将访问权限映射到最小授权的信任委托，实现安全、可控的联邦访问。更多信息请参考[创建OIDC身份提供商的信任委托](https://support.huaweicloud.com/usermanual-iam5/iam_01_1304.html)。
