You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取OAuth登录的AWS用户凭证以执行实例描述等操作?

实现AWS用户OAuth登录后的权限授权方案

核心思路

不用服务账号,直接让应用依托登录用户自身的AWS IAM权限访问资源,关键是通过AWS的OIDC/IAM身份中心流程获取用户的临时凭证,而非长期密钥。

具体步骤

1. 配置AWS端的身份认证入口

方案A:用AWS IAM身份中心(推荐)

  • 在AWS控制台开启IAM身份中心,创建一个OIDC类型的应用程序,填写你的应用回调URL,获取客户端ID和客户端密钥。
  • 用户登录时,引导跳转到IAM身份中心的授权页面,验证用户自己的AWS账号密码。

方案B:自定义OIDC身份提供商

  • 在IAM控制台注册你的应用为OIDC客户端,设置信任关系,让AWS认可你的应用的OIDC请求。

2. 手动对接AWS OAuth流程(替代goth)

goth这类通用库没适配AWS的临时凭证逻辑,得自己走以下流程:

  • 引导用户跳转至AWS授权端点:
    https://<你的IAM身份中心域名>/oauth2/authorize?response_type=code&client_id=<你的客户端ID>&redirect_uri=<回调URL>&scope=openid+aws.cognito.signin.user.admin
    
  • 用户登录后,你的回调接口会收到code参数,用这个code调用令牌端点换访问令牌:
    POST https://<你的IAM身份中心域名>/oauth2/token
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=authorization_code&client_id=<客户端ID>&client_secret=<客户端密钥>&code=<授权码>&redirect_uri=<回调URL>
    
  • 拿到访问令牌后,调用AWS STS的AssumeRoleWithWebIdentity接口,传入令牌和预先创建的角色ARN(该角色需信任你的OIDC身份提供商),获取临时凭证:AccessKeyId、SecretAccessKey、SessionToken。

3. 用临时凭证调用AWS服务

以Go为例,直接把临时凭证配置到AWS SDK里,调用接口时会自动应用用户的IAM权限:

import (
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/ec2"
)

// 假设已获取到临时凭证
tempCreds := credentials.NewStaticCredentials(accessKey, secretKey, sessionToken)
sess, _ := session.NewSession(&aws.Config{
    Region:      aws.String("us-east-1"),
    Credentials: tempCreds,
})

ec2Client := ec2.New(sess)
// 调用DescribeInstances时,会严格遵循用户自身的IAM策略返回结果
resp, err := ec2Client.DescribeInstances(nil)

4. 关键配置要点

  • 确保扮演的IAM角色信任策略正确,允许OIDC用户角色切换:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::123456789012:oidc-provider/<你的OIDC域名>"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "<你的OIDC域名>:sub": "${aws:userid}"
            }
          }
        }
      ]
    }
    
  • 临时凭证有效期最长12小时,可通过刷新令牌续期,全程不用存储用户的长期密钥。
  • 用户能访问的资源完全由其自身IAM策略控制,比如用户A的策略仅允许查看标记为Owner=UserA的实例,调用接口时只会返回符合条件的实例。

内容的提问来源于stack exchange,提问作者Eduardo Masegosa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:33:21