android - bad token
巴扎黑
巴扎黑 2017-04-17 13:32:05
[Android讨论组]

按照文档上讲解的一步步生成token后,测试上传一直失败,提示是401 bad token ,错误是很明显了,可是我检查好久了,真不知问题出在哪里了?我贴出生成token的代码:

    public static  String getUploadToken(String fileName) {
        String token = null;
        try{
            //一:将上传策略转换成Json格式
            JSONObject policy = new JSONObject();
            StringBuilder scope = new StringBuilder();
            scope.append(bucket);
            scope.append(":");
            scope.append(fileName);
            policy.put("scope",scope.toString());   //只允许上传指定key的文件,而key就是文件名
            scope = null;
            policy.put("deadline",getTimer());
            //policy.put("insertOnly",1); //不允许修改
            //policy.put("callbackFetchKey",1);   //启动fetchKey上传模式
            // policy.put("returnBody ","{\"name\" : \"$(fname))}");
            Log.d("policy",policy.toString());

            //二:对JSON编码的上传策略进行URL安全的Base64编码,得到待签名字符串:
            String encodPutPolicy = Base64.encodeToString(policy.toString().getBytes("UTF-8"), Base64.URL_SAFE);
            Log.i("encodPutPolicy","encodPutPolicy is "  + encodPutPolicy);

            //三:使用SecertKey对上一步生成的待签名字符串计算HMAC-SHA1签名:并对签名进行URL安全的Base64编码:
            String encodSign = hmac_sha1(SK,encodPutPolicy);
            Log.i("encodSign","encodSign is "  + encodSign);

            //五:将AccessKey、encodedSign和encodedPutPolicy用:连接起来:
            token = AK + ':' + encodSign + ':' + encodPutPolicy;
            Log.i("token","token is "  + token);

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

    private static long getTimer() {
        return System.currentTimeMillis() + 3600;    //上传凭证的有效期
    }

    //对字符串进行HMAC-SHA1签名
    private static String hmac_sha1(String key,String message) {
        String reString = null;
        try {
            byte[] data = key.getBytes("UTF-8");
            //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
            SecretKey secretKey = new SecretKeySpec(data, "HmacSHA1");
            //生成一个指定 Mac 算法 的 Mac 对象
            Mac mac = Mac.getInstance("HmacSHA1");
            //用给定密钥初始化 Mac 对象
            mac.init(secretKey);

            byte[] text = message.getBytes("UTF-8");
            //完成 Mac 操作
            byte[] text1 = mac.doFinal(text);
            reString = Base64.encodeToString(text1, Base64.URL_SAFE);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return reString;
    }

其中AK和SK分别是我七牛空间的AccessKey和SecretKey.
Base64用的是 com.loopj.android.http.Base64;包的。我是哪里还没有符合规范吗?

巴扎黑
巴扎黑

全部回复(3)
PHPz

不应该在 android app 里面去生成 uptoken。原因是:不能把 SecretKey 放到客户端软件中,这会导致你的存储空间存在被他人访问的风险。正确做法是,应该由你的服务器生成 uptoken 然后返回给 android 客户端。

天蓬老师

我也碰到这样的问题 请问在客户端怎么解决 我就一个人用 要什么服务端

阿神

我的之前还是好的,今天提示:客户端认证授权失败。请重试或提交反馈。(401:bad token),群里问了问,有人今天也遇到同样的问题,想问问怎么解决啊?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号