qiniu / dart-sdk

Qiniu Resource (Cloud) Storage SDK for Dart
24 stars 25 forks source link

如何获取生成upload token ? #47

Closed youkale closed 3 years ago

youkale commented 3 years ago

SDK内未包含token生成代码,然后就对照该 上传凭证 文档撸了一个token生成的代码. 如下:

出现问题:

  • 401 {error: bad token}
  • 403 {“error”:”key doesn’t match with scope”}
import 'dart:convert';
import 'dart:io';
import 'package:crypto/crypto.dart';
import 'package:path/path.dart';
import 'package:qiniu_flutter_sdk/qiniu_flutter_sdk.dart';

const returnBody ="{\"name\":\$(fname),\"size\":\$(fsize),\"w\":\$(imageInfo.width),\"h\":\$(imageInfo.height),\"hash\":\$(etag)}";
class Qiniu {
  final String _appid;
  final String _secret;
  final String _bucket;
  final Storage _storage = Storage();

  Qiniu(this._appid, this._secret, this._bucket);

  String _signal(fileName) {
    var deadline = DateTime.now().add(Duration(hours: 1));
    var unixTs = deadline.toUtc().millisecondsSinceEpoch / 1000;
    var putPolicy = jsonEncode({
      "scope": "$_bucket:$fileName",
      "deadline": unixTs.toInt(),
      "returnBody": returnBody
    });
    var b64 = base64Encode(utf8.encode(putPolicy));
    var hmacSha1 = Hmac(sha1, utf8.encode(this._secret));
    var d = hmacSha1.convert(utf8.encode(b64));
    var sig = base64Encode(d.bytes);
    return "$_appid:$sig:$b64";
  }

  Future<void> upload(File file, Function callback) async {
    var fn = basename(file.path);
    var token = _signal(fn);
    _storage.putFile(file, token,options: PutOptions(key: "$_bucket:$fn")).then((resp) {
      if (null != callback) {
        Function.apply(callback, [callback]);
      }
    }).catchError((e, s) {
      print(e);
    });
  }
}

找到了,,应该用这个版本。 qiniu_sdk_base 0.3.1

huangbinjie commented 3 years ago

你前台签 token 吗...这个场景有点超出预期。

我们 base 的定位是共享代码,理想的场景应该是如果后期有可能有 qiniu_server_sdk 的话,签 token 的代码会在那里暴露出去。

yinxulai commented 3 years ago

你好,我们不推荐在客户端生成 token,生成 tokne 需要使用 ak/sk,在客户端使用 ak/sk 被认为是一种高危行为,可能导致你的 ak/sk 被泄漏,因此我们推荐在服务端生成 token,如果你能够确保你的客户端的使用环境是安全的 qiniu_sdk_base 确实可以解决你的需求