开发者社区> 问答> 正文

oss c sdk列出bucket下面的object提示SignatureDoesNotMatch

      各位大神,我写了段代码列出某个bucket下面的所有object提示SignatureDoesNotMatch,参照的是 http://helpcdn.aliyun.com/document_detail/oss/sdk/c-sdk/get-started.html写的。代码我贴出来,大家看看有没有什么不对的:



int main(int argc, char **argv)
{
    if (aos_http_io_initialize("oss_test", 0) != AOSE_OK)
    {
        exit(1);
    }


    aos_pool_t *p;
    int is_oss_domain = 0;
    oss_request_options_t *oss_request_options;
    aos_pool_create(&p, NULL);


    //init_oss_request_options
    oss_request_options = oss_request_options_create(p);
    oss_request_options->config = oss_config_create(oss_request_options->pool);
    aos_str_set(&oss_request_options->config->host, "oss-cn-hangzhou.aliyuncs.com");
    oss_request_options->config->port = 80;
    aos_str_set(&oss_request_options->config->id, "abcdef");
    aos_str_set(&oss_request_options->config->key, "XXXXXXXX");
    oss_request_options->config->is_oss_domain = is_oss_domain;
    oss_request_options->ctl = aos_http_controller_create(oss_request_options->pool, 0);


    aos_status_t *s;
    aos_table_t *resp_headers;
    aos_string_t bucket;
    char *bucket_name = "/mydomain/a/b/c/d/e/";
    oss_list_object_params_t *params;


    aos_str_set(&bucket, bucket_name);
    resp_headers = aos_table_make(p, 0);
    s = aos_status_create(p);


    params = oss_create_list_object_params(p);
    params->max_ret = 20;


    s = oss_list_object(oss_request_options, &bucket, params, &resp_headers);
    aos_pool_destroy(p);


    aos_http_io_deinitialize();


    return 0;
}


       调用oss_list_object函数后调试信息如下:
       s = 0x02720ee0 {code=403 error_code=0x027214e0 "SignatureDoesNotMatch" error_msg=0x027214f8 "The request signature we calculated does not match the signature you provided. Check your key and signing method." ...}


       实际上,如果我在浏览器中输入以下地址,访问某个object时,是可以的。就像下面这样:
       http://mydomain.oss-cn-hangzhou.aliyuncs.com/a/b/c/d/e/f.txt?OSSAccessKeyId=abcdef&Expires=1448637894&Signature=1234509876%5f7DEAop
       这样浏览器就可以直接显示该文件的内容。
       示例代码里面也没看到要提供Signature,而且我是访问bucket,列出里面的object。求大神帮忙解答,谢谢。

展开
收起
zxywd 2015-11-27 22:53:59 6744 0
2 条回答
写回答
取消 提交回答
  • Reoss c sdk列出bucket下面的object提示SignatureDoesNotMatch
    改成int is_oss_domain = 1之后,更不行,出现下面的调试信息:
    0x02570f48 {code=-990 error_code=0x00cad5b8 "HttpIoError" error_msg=0x02571200 "couldn't resolve host name" ...}

    把aos_str_set(&oss_request_options->config->host,endpoint); endpoint改成:
    mydomain.oss-cn-hangzhou.aliyuncs.com
    mydomain.oss-cn-hangzhou.aliyuncs.com/
    http://mydomain.oss-cn-hangzhou.aliyuncs.com/
    http://mydomain.oss-cn-hangzhou.aliyuncs.com/a/b/c/d/e/
    还是出现上面的调试信息。

    后来又改了char *bucket_name ;
    换成mydomain/a/b/c/d/e/
    /mydomain/a/b/c/d/e/
    /mydomain
    /a
    a/
    出现的是上面的调试信息

    换成a或者mydomain出现下面的调试信息:
    s = 0x026f0f10 {code=400 error_code=0x026f1418 "InvalidBucketName" error_msg=0x026f1430 "The specified bucket is not valid." ...}
    不知道这个是怎么回事?

    2015-11-28 20:37:16
    赞同 展开评论 打赏
  • 回 楼主(zxywd) 的帖子
    问题在  int is_oss_domain = 0; 这句话,改成int is_oss_domain =1。您用的是oss的域名,此处如果是cname,才需要改成0

    -------------------------

    回 2楼(zxywd) 的帖子
    亲,bucketname是有一定规则的,只能是数字字母或者横线,具体可以参考 http://help.aliyun.com/document_detail/oss/user_guide/oss_concept/concepts.html, 您是要列出某个bucket的所有文件,这个bucket需要存在,从您贴的代码来看bucketname包含斜杠/肯定有问题,如果bucket名字不清楚,可以去控制台看一下您现在已有的bucket名字。另外endpoint只需要填域名,比如oss-cn-hangzhou.aliyuncs.com
    2015-11-28 10:45:53
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载