关于oss自签名总是验证通不过的总结

如果我们使用oss存储数据,那么不可避免的需要了解oss存储服务的安全验证方面的东西,其中在初始化oss的时候提供了两种方式的验证:STS鉴权模式  和 自签名模式,本人使用的是  自签名模式 但是在调试过程中着实坑了很久,现将注意事项总结如下帮助需要的人:

使用自签名模式,在初始化oss的时候需要传入OSSCustomSignerCredentialProvider这个类,以android端的代码为例

这个类具体实现示例如下:

OSSCredentialProvider credentialProvider = new OSSCustomSignerCredentialProvider() {
    @Override
    public String signContent(String s) {


        OkHttpClient okHttpClient = new OkHttpClient();
        String url = null;
        try {
            url = ApiStores.API_SERVER_URL + "/aliyun/oss/getPolicy?s=" + URLEncoder.encode(s, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
        Request request = new Request.Builder()
                .url(url)
                .build();
        Call call = okHttpClient.newCall(request);
        Response response = null;
        try {
            response = call.execute();
            String string = response.body().string();
            OssTokenModel token = new Gson().fromJson(string, OssTokenModel.class);
            return "OSS " + accessKeyId + ":" + token.getSignedString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }
};

注意以上代码的:

1,signContent(String s)方法,该方法是在子线程中执行的,那么我们只需在这个线程中调用同步网络请求即可,注意是同步网络请求,该方法是oss异步调用的不会阻塞主线程

2,signContent(String s)方法是oss上传文件时异步回调的方法,方法的参数s已经是完全拼接好的字符串,里面已经包含了所需的全部字段(比如请求类型,文件类型,文件资源路径等),同时,其中也包含了必须的换行符,这一点需要非常注意,因为在与应用server交互的时候有可能会在传输过程中导致换行符丢失,所以我们需要将该字符串s进行转码:URLEncoder.encode(s, "UTF-8");

3,通过应用server得到的签名之后的字符串需要进行拼接"OSS " + accessKeyId + ":" + token.getSignedString();

注意"OSS "这个串右边包含了一个空格符号很容易忽略

4,如第2条所讲,signContent(String s)的参数s已经被oss拼接完成,我们只需要将其转码之后传到后台进行签名即可,后台签名需要先解码,代码如下

@ResponseBody
@RequestMapping("/getPolicy")
public Message getPolicy(@RequestParam String s) throws Exception {
    String tosign = URLDecoder.decode(s, "UTF-8");
    String signed = ServiceSignature.create().computeSignature(AccessKeySecret, tosign);
    Message message = new Message(Message.SUCCESS, signed, "处理成功");
    return message;
}

其中参数s即为前段传递过来的需要前面的字符串,先将其通过URLDecoder.decode(s, "UTF-8");解码,然后通过ServiceSignature.create().computeSignature(AccessKeySecret, tosign);签名即可

ServiceSignature这个类来自于如下依赖,pom文件中添加如下依赖即可

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>2.8.1</version>
</dependency>

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值