本文将结合阿里云RAM访问控制,向您演示如何配置M2M应用的无AK访问方式,并获取STS Token的流程。
前提条件
-
已完成M2M应用的相关配置。了解M2M相关应用及配置,请参考:M2M应用(机器间权限管理)。
创建OIDC身份提供商
-
使用RAM管理员登录RAM控制台。
-
在左侧导航栏,选择。
-
在角色 SSO页签,先单击OIDC页签,然后单击创建身份提供商。
-
在创建身份提供商页面,设置身份提供商信息。
参数
说明
身份提供商名称
同一个阿里云账号下必须唯一,与 IDaaS 无关,按照 RAM 规则录入。
颁发者 URL
-
颁发者 URL(Issuer URL)是外部身份提供商(IdP)为M2M应用分配的唯一标识,用于OAuth 2.0等协议中校验令牌来源。
-
阿里云IDaaS会基于此URL验证外部IdP颁发的令牌的有效性,其配置位于IDaaS M2M应用(Client端)的 Issuer 字段中。
验证指纹
-
填写完颁发者 URL后,您可以单击获取指纹,阿里云会辅助您自动计算出验证指纹,但是建议您在本地自己计算一次(例如:通过OpenSSL获取OIDC IdP的指纹),与阿里云计算的指纹进行对比。
-
如果对比发现不同,则说明该颁发者URL可能已经受到攻击,请您务必再次确认,并填写正确的指纹,RAM 会根据录入的 Issuer 地址访问获取指纹。
说明当您的IdP计划进行证书轮转时,请在轮转前生成新证书的指纹并添加到阿里云OIDC身份提供商信息中,一段时间(至少一天)以后再进行证书轮转,证书轮转确认可以换取到STS Token后再删除旧的指纹。
客户端ID
-
客户端ID(Client ID)是您的应用在外部身份提供商(IdP)注册时生成的唯一标识。当外部IdP签发OIDC令牌(OIDC Token)时,需使用该客户端ID,且令牌的aud字段会携带此ID。在阿里云OIDC身份提供商中配置此客户端ID后,系统会在使用OIDC Token换取STS Token时校验aud字段的客户端ID是否匹配,确保安全扮演角色。
-
单个OIDC身份提供商最多支持配置50个客户端ID,适用于多应用访问阿里云的场景。
-
在M2M(Machine-to-Machine)应用场景中,客户端ID对应 IDaaS M2M 应用中配置的受众标识,用于服务端间认证。
最早颁发时间限制
在该限制时间之前颁发的OIDC Token不允许换取STS Token。默认值:12小时。取值范围:1~168小时。
备注
身份提供商的描述信息。
-
-
单击创建身份提供商。
创建OIDC身份提供商角色
-
前往阿里云RAM访问控制控制台,选择。
-
在编辑器页面,按照以下步骤,开始添加身份提供者。
单击可视化编辑页签,在主体类型中选择身份提供者,然后单击添加按钮添加身份提供者。
-
在添加主体弹出框中,选择上文中已经创建好的身份提供者,点击确定完成添加。
将身份提供者类型选择为OIDC。
-
身份提供者添加完成后,会默认生成iss和aud条件,您可以选择编辑或删除这两个条件,也可以继续添加新的条件。
默认生成的两个条件键分别为
oidc:iss和oidc:aud,运算符均为 StringEquals。 -
下文以添加
sub条件表达式为例,向您演示如何添加条件,您可按实际需要选择是否添加。编辑完成后,点击确定,即可完成添加。说明-
条件值:您需要填入已经创建好的M2M应用Server端的 client_id。如何添加M2M应用及查看受众标识等信息,请参考:M2M应用(机器间权限管理)。
-
如果您需要了解更多条件表达式的信息,请参考:权限策略基本元素。
-
当前RAM OIDC中仅支持三种条件:oidc:iss、oidc:aud、oidc:sub。
在运算符下拉框中选择
StringEquals。 -
-
单击底部的确定,在创建角色弹出框中,填入您要创建的角色名称,单击确定,即可完成角色创建。
角色授权
您可以根据需要,向已创建的角色新增授权。
在角色的权限管理页签下单击新增授权,资源范围选择账号级别,在权限策略搜索框中输入 idaas 进行筛选,勾选系统策略 AliyunYundunIdaasReadOnlyAccess,然后单击确认新增授权。
获取M2M Token
通过curl命令方式获取
-
请将以下占位参数替换为您的应用配置后,执行curl命令,获取Token。
# 请将<app_issuer_endpoint>、<YOUR_APP_CLIENT_ID>、<YOUR_APP_CLIENT_SECRET>和<YOUR_SERVER_AUD_IDENTIFIER>替换为您M2M应用的具体配置值。 # # <YOUR_SERVER_ISSUER_ENDPOINT>:Issuer,“Resources Server应用 > 通用配置 > Issuer“中查看Endpoint并替换。 # <YOUR_APP_CLIENT_ID>:客户端ID,在“Client应用 > 通用配置 > 凭证管理“中查看client_id并替换。 # <YOUR_APP_CLIENT_SECRET>:客户端Secret,在“Client应用 > 通用配置 > 凭证管理“中查看client_secret并替换。 # <YOUR_SERVER_AUD_IDENTIFIER>:服务端受众标识,在“Resources Server应用 > 服务端权限开放 > 权限应用 > 受众标识“中,查找受众标识并替换。 # curl --location --request POST 'https://<YOUR_SERVER_ISSUER_ENDPOINT>.aliyunidaas.com/api/v2/iauths_system/oauth2/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=<YOUR_APP_CLIENT_ID>' \ --data-urlencode 'client_secret=<YOUR_APP_CLIENT_SECRET>' \ --data-urlencode 'grant_type=client_credentials' \ #.all 是阿里云 IDaaS 平台中的一个预定义范围标识符,表示 请求该受众(Audience)下的所有可用权限。 --data-urlencode 'scope=<YOUR_SERVER_AUD_IDENTIFIER>|.all' -
Token获取成功时结果如下。
xxx ~ % curl --location --request POST 'https://xxx.aliyunidaas.com/api/v2/iauths_system/oauth2/token' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'client_id=app_xxx4y54' \ --data-urlencode 'client_secret=CSHoxxx5ZQ6' \ --data-urlencode 'grant_type=client_credentials' \ --data-urlencode 'scope=xxx.all' { "token_type": "Bearer", "access_token": "eyJrxxxi5rg", "expires_in": 3600, "expires_at": 1741336113 }
通过Postman工具获取
-
请将各参数替换为您的应用配置参数后,通过Postman发起请求获取token。
请求地址为
POST https://<IDaaS实例域名>.aliyunidaas.com/api/v2/iauths_system/oauth2/token,Body 选择 x-www-form-urlencoded 编码方式,包含参数client_id、client_secret、grant_type(值为client_credentials)和scope。请求成功后(200 OK),返回的 JSON 响应体格式:{ "token_type": "Bearer", "access_token": "eyJrxxx...xxxDiCw", "expires_in": 3600, "expires_at": 1741331524 }其中
access_token即为获取到的 Bearer 类型访问令牌,有效期为 3600 秒。
通过M2M Token获取RAM角色的临时身份凭证(STS Token)
如果您暂时不了解阿里云STS,请先前往了解什么是STS。
OpenAPI方式获取
-
前往OpenAPI门户,找到AssumeRoleWithOIDC接口。
说明本文仅演示获取,更多关于AssumeRoleWithOIDC接口的详细信息,请参见:AssumeRoleWithOIDC - OIDC角色SSO时获取扮演角色的临时身份凭证。
-
填写接口所需的必要参数,确认无误后点击发起调用,即可获取到STS Token。
重要-
OIDCProviderArn:请前往您已创建的OIDC身份服务提供商角色的基本信息中,从信任策略中获取。
-
RoleArn:请前往您已创建的OIDC身份服务提供商角色的基本信息中,找到ARN并获取。
-
OIDCToken:填入您上文中已获取成功的M2M Token。
-
RoleSessionName:无特殊要求,用户自定义字段,仅作为角色标识。
-