Python 使用阿里云 STS 获取临时访问凭证并上传文件至 OSS:Flask API 实现

在云计算环境中,阿里云的 OSS(对象存储服务)广泛应用于存储和管理海量数据。为了确保数据安全,OSS 提供了基于 STS(Security Token Service) 的临时访问凭证来控制用户对存储桶的访问权限。本篇文章将演示如何使用 Flask 构建一个 API,通过 STS 获取临时访问凭证,然后用这个凭证上传文件至 OSS。

1. 背景介绍

STS 是一种安全的访问控制方式,允许用户在有限时间内通过临时凭证访问阿里云资源。通过生成 临时访问凭证,你可以在不暴露敏感信息(如 AccessKey)的情况下,允许授权用户访问特定的资源。本文的主要步骤包括:

  1. 通过 STS 获取临时凭证。
  2. 使用 Flask 搭建一个接口来获取这个临时凭证。
  3. 使用凭证初始化 OSS 客户端并上传文件。

2. 安装依赖

在开始之前,你需要安装 Flask、Aliyun SDK 和其他一些必要的 Python 库:

bash 复制代码
pip install flask aliyun-python-sdk-core oss2

3. Flask API:获取阿里云临时凭证

首先,我们将通过 Flask 构建一个 API,接收带有 Bearer Token 的请求,验证后调用阿里云 STS 获取临时凭证。

python 复制代码
from aliyunsdkcore.client import AcsClient
from aliyunsdksts.request.v20150401 import AssumeRoleRequest
import json
from flask import Flask, request, jsonify
from functools import wraps

app = Flask(__name__)

def validate_bearer_token(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # 获取Authorization头
        auth_header = request.headers.get('Authorization')

        # 检查Authorization头是否存在
        if not auth_header:
            return jsonify({'error': 'Authorization header is missing'}), 401

        # 检查Authorization头是否以'Bearer'开头
        parts = auth_header.split()
        if len(parts) != 2 or parts[0].lower() != 'bearer':
            return jsonify({'error': 'Invalid Authorization header'}), 401

        # 提取token并验证
        token = parts[1]
        if token != 'token':
            return jsonify({'error': 'Invalid Bearer token'}), 401

        # 调用实际的路由函数
        return func(*args, **kwargs)

    return wrapper

@app.route('/get_oss_token', methods=['GET'])
@validate_bearer_token
def get_oss_token():
    # 阿里云账号AccessKey ID和AccessKey Secret
    access_key_id = 'LTAI5tR3XDjgjxe1cxxxxxxxx'
    access_key_secret = 'bb4vGoJozsbu0yteXXXXXXXP'
    # STS角色的ARN(在RAM控制台获取)
    role_arn = 'acs:ram::XXXX:role/aliyunosstokengeneratorrole'
    # 创建ACS客户端
    acs_client = AcsClient(access_key_id, access_key_secret, 'cn-shanghai')
    # 发起AssumeRole请求
    request = AssumeRoleRequest.AssumeRoleRequest()
    request.set_RoleArn(role_arn)
    request.set_RoleSessionName('oss-bucket-put-object')  # 设置会话名称,可自定义
    response = acs_client.do_action_with_exception(request)
    token_info = json.loads(response)
    return jsonify(token_info)

if __name__ == '__main__':
    app.run(debug=True, port=5002, host="0.0.0.0")
代码解析:
  1. 验证 Bearer Token :通过装饰器 @validate_bearer_token,我们确保所有的请求都包含正确的 Bearer Token。如果请求中的 token 无效或缺失,将返回 401 错误。
  2. 获取临时凭证 :在 /get_oss_token 路由中,我们通过 AssumeRoleRequest 调用阿里云 STS 接口,获取临时凭证。响应中将包含 AccessKeyIdAccessKeySecretSecurityToken,这些都将用于后续的 OSS 操作。

4. 使用临时凭证上传文件至 OSS

获取临时凭证后,我们可以使用 oss2 库来初始化 OSS 客户端,上传文件到指定的存储桶。

python 复制代码
import json
import oss2
import requests

# 解析AssumeRole响应,获取临时访问凭证
token_info = json.loads(response)
access_key_id_sts = token_info['Credentials']['AccessKeyId']
access_key_secret_sts = token_info['Credentials']['AccessKeySecret']
security_token = token_info['Credentials']['SecurityToken']

# 使用STS凭证初始化OSS Auth
bucket_name = 'lanrenchengxu'
endpoint = "http://oss-cn-shanghai.aliyuncs.com"
# 上传本地文件到OSS
auth = oss2.StsAuth(access_key_id_sts, access_key_secret_sts, security_token)

# 使用StsAuth实例初始化存储空间。
bucket = oss2.Bucket(auth, endpoint, bucket_name)

# 模拟从其他地方获取文件(例如通过请求)
headers = {'Authorization': 'Bearer token'}
response = requests.get(f"http://127.0.0.1:5002/file/CMF5FCOA", headers=headers)

# 上传文件
result = bucket.put_object('file/1.html', response.content)
print(result.status)
print("File uploaded successfully.")
代码解析:
  1. 解析临时凭证 :从 AssumeRole 返回的 JSON 响应中提取 AccessKeyIdAccessKeySecretSecurityToken
  2. 初始化 OSS 客户端 :使用 StsAuth 初始化 OSS 客户端,传入临时凭证。
  3. 上传文件 :通过 bucket.put_object() 将文件上传至 OSS 存储桶。

5. 测试

  1. 启动 Flask 服务器:

    bash 复制代码
    python app.py
  2. 在浏览器或 API 客户端(如 Postman)中,向 http://127.0.0.1:5002/get_oss_token 发起 GET 请求,并在请求头中添加 Bearer Token:

    bash 复制代码
    Authorization: Bearer token
  3. 服务器会返回一个临时的 OSS 凭证,随后你可以使用它上传文件至 OSS。

6. 总结

通过以上步骤,我们创建了一个通过 阿里云 STS 获取临时访问凭证的 Flask API。通过这个 API,用户可以通过 Bearer Token 获取临时的 OSS 访问权限,然后用这些凭证安全地上传文件至阿里云 OSS。这种方式不仅简化了权限管理,还增强了安全性。

希望本教程能帮助你理解如何使用阿里云的 STS 服务,并通过 Flask 实现临时凭证管理。如果你有任何问题,欢迎在评论区提问。

相关推荐
qq_4609784013 小时前
如何在 PHP 包含文件中动态排除当前页面的导航项
jvm·数据库·python
编码者卢布13 小时前
【App Service】查看Application Insights自身SDK日志的方法示例
后端·python·flask
一朵缥缈的向日葵.13 小时前
[特殊字符] Mojo 语言:为 AI 硬件而生的“Python 升级版” —— 完整指南
人工智能·python·mojo
wolfengi13 小时前
python之使用docxtpl渲染word模板
数据库·python·word
2401_8314194413 小时前
Layui如何实现表格内部的图片点击后进入相册轮播模式
jvm·数据库·python
Jetev13 小时前
SQL使用JOIN连接更新目标表数据_UPDATE语句结合JOIN语法实现
jvm·数据库·python
2401_8323655213 小时前
如何用最快速度完成Navicat的Linux系统完美安装配置_傻瓜式操作步骤
jvm·数据库·python
财经资讯数据_灵砚智能13 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月29日
大数据·人工智能·python·信息可视化·自然语言处理
SilentSamsara13 小时前
Python 内存管理:引用计数、循环垃圾回收与内存泄漏排查
开发语言·vscode·python·青少年编程·pycharm
AI技术增长13 小时前
Pytorch图像去噪实战(七):Noise2Noise自监督图像去噪实战,没有干净图也能训练模型
人工智能·pytorch·python