开发者社区 问答 正文

C-SDK之如何实现授权访问(一)?


使用STS服务临时授权


OSS可以通过阿里云STS服务,临时进行授权访问。使用STS时请按以下步骤进行:

  1. 在官网控制台创建子账号,参考OSS STS
  2. 在官网控制台创建STS角色并赋予子账号扮演角色的权限,参考OSS STS
  3. 使用子账号的AccessKeyId/AccessKeySecret向STS申请临时token
  4. 使用临时token中的认证信息创建OSS的Client
  5. 使用OSS的Client访问OSS服务


使用STS凭证构造签名请求


用户的client端拿到STS临时凭证后,通过其中安全令牌(SecurityToken)以及临时访问密钥(AccessKeyId, AccessKeySecret)生成oss_request_options。以上传文件为例: aos_pool_t *p;
oss_request_options_t *options;
aos_status_t *s;
aos_table_t *headers;
aos_table_t *resp_headers;
char *bucket_name = "<您的bucket名字>";
char *object_name = "<您的object名字>";
aos_string_t bucket;
aos_string_t object;
char *data = "<object content>";
aos_list_t buffer;
aos_buf_t *content;
aos_pool_create(&p, NULL);
// init_oss_request_options using sts_token
/* 创建并用STS token初始化options */
options = oss_request_options_create(p);
options->config = oss_config_create(options->pool);
aos_str_set(&options->config->endpoint, "<您的Endpoint>");
aos_str_set(&options->config->access_key_id, "<您的临时AccessKeyId>");
aos_str_set(&options->config->access_key_secret, "<您的临时AccessKeySecret>");
aos_str_set(&options->config->sts_token, "<您的sts_token>");
options->config->is_cname = 0;
options->ctl = aos_http_controller_create(options->pool, 0);
/* 初始化参数 */
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
headers = aos_table_make(p, 0);
aos_list_init(&buffer);
content = aos_buf_pack(options->pool, data, strlen(data));
aos_list_add_tail(&content->node, &buffer);
/* 上传文件 */
s = oss_put_object_from_buffer_s(options, &bucket, &object, &buffer, headers, &resp_headers);
if (aos_status_is_ok(s)) {
    printf("put object succeeded\n");
} else {
    printf("put object failed\n");
}
aos_pool_destroy(p);



URL签名授权


可以通过生成签名URL的形式提供给用户一个临时的访问URL。在生成URL时,可以指定URL过期的时间,从而限制用户长时间访问。

生成签名url


通过oss_gen_signed_url接口生成请求url签名。

生成下载请求的url签名
aos_pool_t *p;
oss_request_options_t *options;
aos_http_request_t *req;
char *url_str;
char *bucket_name = "<您的bucket名字>";
char *object_name = "<您的object名字>";
aos_string_t bucket;
aos_string_t object;
apr_time_t now;
int64_t expire_time;
int one_hour = 3600; /* 单位:秒*/
aos_pool_create(&p, NULL);
/* 创建并初始化options */
options = oss_request_options_create(p);
init_options(options);
/* 初始化参数 */
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
req = aos_http_request_create(p);
req->method = HTTP_GET;
now = apr_time_now(); //millisecond
expire_time = now / 1000000 + one_hour;
/* 生成签名url */
url_str = oss_gen_signed_url(options, &bucket, &object, expire_time, req);
printf("临时下载url:%s\n", url_str);
aos_pool_destroy(p);







展开
收起
青衫无名 2017-10-19 11:03:06 1930 分享 版权
阿里云 AI 助理回答

在使用阿里云STS(Security Token Service)服务为OSS(Object Storage Service)提供临时授权访问时,您需要遵循一系列步骤来确保客户端能够安全且有效地与OSS交互。下面我将详细解释如何使用STS凭证构造签名请求以执行OSS操作,如上传文件。

使用STS凭证构造签名请求的步骤:

  1. 获取STS临时凭证

    • 首先,确保您已通过阿里云控制台或API成功申请到了STS临时凭证,这包括AccessKeyId, AccessKeySecret, 以及SecurityToken。这些凭证具有有限的有效期,并赋予了特定的权限。
  2. 初始化OSS请求选项

    aos_pool_t *p;
    oss_request_options_t *options;
    // 创建内存池
    aos_pool_create(&p, NULL);
    // 初始化请求选项结构体
    options = oss_request_options_create(p);
    
  3. 配置STS凭证到请求选项

    options->access_key_id = "<Your AccessKeyId>";
    options->access_key_secret = "<Your AccessKeySecret>";
    options->security_token = "<Your SecurityToken>";
    

    这里,您需要将<Your AccessKeyId>, <Your AccessKeySecret>, 和<Your SecurityToken>替换为从STS服务获取的实际值。

  4. 设置其他请求参数: 根据您的具体需求,可能还需要设置其他参数,比如HTTP头部、超时时间等。

  5. 创建OSS客户端实例

    oss_client_t *client = oss_create_client(options);
    
  6. 构建请求并执行操作: 以上传文件为例,您需要准备数据缓冲区、定义bucket和object名称,然后调用上传接口。

    char *data = "Your file content";
    aos_list_t buffer;
    aos_buf_t *content;
    
    aos_list_init(&buffer);
    content = aos_buf_pack(options->pool, data, strlen(data));
    aos_list_add_tail(&content->node, &buffer);
    
    aos_string_t bucket_name;
    aos_str_set(&bucket_name, "<Your Bucket Name>");
    aos_string_t object_name;
    aos_str_set(&object_name, "<Your Object Key>");
    
    s = oss_put_object_from_buffer(client, &bucket_name, &object_name, &buffer, NULL, NULL);
    
  7. 处理响应和错误: 检查s的状态以确定操作是否成功,并根据需要处理响应头或错误信息。

  8. 清理资源: 在操作完成后,记得释放资源,包括关闭客户端连接和清理内存池。

    oss_release_client(client);
    aos_pool_destroy(p);
    

请确保在实际应用中替换所有的占位符(如<Your Bucket Name><Your Object Key>等)为实际的值,并正确处理可能出现的错误情况,以保证程序的健壮性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答