gpake / qiniu-wxapp-sdk

qiniu SDK based on wxapp
GNU General Public License v3.0
703 stars 278 forks source link

uptoken 的问题 #40

Closed CoXier closed 6 years ago

CoXier commented 6 years ago

你好,很感谢做出这么棒的库。

目前我遇到一个关于 uptoken 的问题。从 README 我了解到,我似乎是可以写死 token 的。但是上传文件的时候,如果指定的 key 和生成 uptoken 的 key 不一样时,上传就会失败。

CoXier commented 6 years ago

我感觉我解释的有点不太清楚,举个例子。

我在 server 上可以生成 uptoken, 程序:

 q = Auth(access_key, secret_key)
    # 要上传的空间
    bucket_name = 'xxx'
    # 上传到七牛后保存的文件名
    key = ''
    # 生成上传 Token,可以指定过期时间等
    token = q.upload_token(bucket_name, key, 3600)

这里的 key 是 ''

但是我在小程序中,如果我没有指定 key 的话,也就是使用微信的 tmp 文件名。就会出现 error。因为这两个 key 是不一样的。

gpake commented 6 years ago

似乎不会这样,因为你生成 token 的时候,并不能确定你要上传的文件名是什么。

gpake commented 6 years ago

你可以看到,在 sdk 内部请求token 的时候,也是在获取 key 之前的

function getQiniuToken(callback) {
  wx.request({
    url: config.qiniuUploadTokenURL,
    success: function (res) {
      var token = res.data.data.token;//res.data.uptoken;
      if (token && token.length > 0) {
        config.qiniuUploadToken = token;
        if (callback) {
            callback();
        }
      } else {
        console.error('qiniuUploader cannot get your token, please check the uptokenURL or server')
      }
    },
    fail: function (error) {
      console.error('qiniu UploadToken is null, please check the init config or networking: ' + error);
    }
  })
}
CoXier commented 6 years ago

但是的确会出现这个问题:{"error":"key doesn't match with scope"}

CoXier commented 6 years ago

如果我显式写了 uptoken 的值,sdk 内部还会 getQiniuToken 吗?

CoXier commented 6 years ago

经过测试,如果在生成 uptoken 时传入的 Key 不一样,那么生成的 token 也会不一样。

gpake commented 6 years ago

不会,token 检查逻辑如下

  1. token 是否已经有值,如果有,就直接用
  2. tokenURL 是否有值,如果有,就是用 getQiniuToken 方法请求服务器
  3. tokenFunc 是否有值,如果有,则调用 tokenFunc() 获取返回值
  4. 如果上述都没有,则报错
CoXier commented 6 years ago

我猜测 token 可能没办法在微信小程序写死,在每次上传前都需要指定 Key 然后生成 token,再上传文件。

gpake commented 6 years ago

我的 app 里是只在 app 第一次调用的时候请求一次 token,后面就一直用了,你试试生成 token 的时候不要带 key,或者看看文档? 不好意思,我现在没有足够的时间看生成 token 的文档。

CoXier commented 6 years ago

请问你第一层生成 token 时指定了 key 的吗?

gpake commented 6 years ago

并没有呀,我的 upTokenUrl 是 https://api.xxx.com/qiniu/token,其他的就交给 sdk 内部处理了

CoXier commented 6 years ago

请问你是指官方有可以生成 token 的接口吗?

https://api.xxx.com/qiniu/token 是官方的吗?

CoXier commented 6 years ago

问题解决了,果然是因为 key 的问题。

如果之后还有人遇到类似的问题,请注意server端不能指定 key。

gpake commented 6 years ago

多谢提醒,下次如果有人遇到我会及时提醒