醉卧山林的执刀人 2024-06-09 23:45 采纳率: 0%
浏览 18

移动云eos,服务端签名,上传图片问题

有没有用过移动云对象存储eos的,采用服务端签名的方式

1参考https://ecloud.10086.cn/op-help-center/doc/article/67454%EF%BC%8C 后端签名,完全使用提供示例signatureServerPolicy-v1.jar中的方法

2.使用signatureServerPolicy-v1.jar的此方法进行签名,

Map<String, String> authorization = signer.computeSignature(durationSeconds, accessKeyId, accessKeySecret, acl,
        bucket, key, contentType)

3.签名完成了,用签名上传图片,提示
Policy missing condition: name

有没有好人知道怎么回事

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-09 23:52
    关注

    引自免费微信小程序:皆我百晓生

    遇到在使用移动云EOS服务端签名上传图片时出现“Policy missing condition: name”的错误,这通常意味着在构建签名策略(policy)时,没有正确地包含所有必需的条件。具体到这个错误,表明policy中缺少了对object名称的限定条件。

    解决这个问题的关键在于确保policy中包含了对object name的限制。在computeSignature方法中,通过acl, bucket, key等参数传递的信息,可以构造出符合要求的policy。然而,有时这些信息可能不足以让SDK自动生成一个完整的、满足服务器验证需求的policy。

    为了解决这个问题,你可以尝试手动构建policy JSON字符串,并在调用computeSignature方法时,将这个JSON字符串作为参数传入。这样可以确保policy中包含了所有必要的条件,包括object的name。

    下面是一个示例代码,展示如何手动构建一个包含object name条件的policy:

    import com.alibaba.fastjson.JSON;
    import java.util.Date;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    // 假设Signer类和computeSignature方法已经按照移动云的SDK实现
    // 这里只展示如何构建policy
    public class CustomPolicyBuilder {
    
        public static void main(String[] args) {
            String accessKeyId = "your_access_key_id";
            String accessKeySecret = "your_access_key_secret";
            String bucket = "your_bucket_name";
            String key = "path/to/your/object";
            int durationSeconds = 3600; // 签名有效期,单位:秒
            String contentType = "image/jpeg"; // 上传文件的MIME类型
            String acl = "public-read"; // 对象的访问权限
    
            // 构建policy
            Map<String, Object> policyMap = new LinkedHashMap<>();
            policyMap.put("expiration", new Date(System.currentTimeMillis() + (durationSeconds * 1000)).toGMTString());
            policyMap.put("conditions", new Object[]{
                {"bucket", bucket},
                {"name", key},
                {"acl", acl},
                {"Content-Type", contentType}
            });
    
            String policyJson = JSON.toJSONString(policyMap);
    
            // 使用自定义的policy进行签名
            Map<String, String> authorization = signer.computeSignature(durationSeconds, accessKeyId, accessKeySecret, policyJson);
            
            // 接下来使用authorization中的信息进行上传操作
            // ...
        }
    }
    

    在上述代码中,我们首先创建了一个LinkedHashMap来构建policy的JSON结构,其中特别注意了"conditions"部分,确保包含了{"name", key}这一项。然后使用JSON.toJSONString()将这个map转换为JSON格式的字符串,最后将其传递给computeSignature方法进行签名。

    通过这种方式,你可以确保policy中包含了所有必要的条件,从而避免“Policy missing condition: name”的错误。记得替换代码中的your_access_key_id, your_access_key_secret, your_bucket_name, path/to/your/object等占位符为你实际使用的值。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月9日