Binaryify / NeteaseCloudMusicApi

网易云音乐 Node.js API service
https://gitlab.com/Binaryify/neteasecloudmusicapi
30.29k stars 15.78k forks source link

小程序中请求带了cookie,还是提示需要登录 #390

Closed estoi closed 5 years ago

estoi commented 5 years ago

环境

系统: macOs nodejs 版本:8.0.0

出现问题

在小程序中使用官方的wx.request发送请求 在header带了cookie(登录接口返回的) 然后请求需要登录的接口仍然提示需要登录

重现步骤

 wx.request({
            data,
            method,
            header: {
                cookie: wx.getStorageSync('cookie')
            },
            url: apiUrl + url,
            success: res => {
                if (res.data.code === 0) {
                    resolve(res.data.data)
                } else {
                    reject(res.data)
                }
            }
        })

期待效果

接口正常返回数据

重现步骤尽量详细,不能含糊不清

如果不是提建议,提 issues 如果不照着模版来将不会优先处理或直接关闭

nondanee commented 5 years ago

将 until/request.js 里面的 request.debug = true 取消注释看一下有没有带 cookie,也可能是 cookie-parser 的问题 ……

estoi commented 5 years ago

将 until/request.js 里面的 request.debug = true 取消注释看一下有没有带 cookie,也可能是 cookie-parser 的问题 ……

cookie是空的

estoi commented 5 years ago
REQUEST { method: 'POST',
  url: 'https://music.163.com/weapi/v1/discovery/recommend/resource',
  headers:
   { 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
     'Content-Type': 'application/x-www-form-urlencoded',
     Referer: 'https://music.163.com',
     Cookie: '' },

@nondanee

nondanee commented 5 years ago

请确认一下 wx.getStorageSync('cookie') 有没有数据,比如写在 URL 里 cookie-parser 在 app.js 里,可以 log 一下 req.headers.cookie,个人感觉不是 parser 的问题

estoi commented 5 years ago

@nondanee wx.getStorageSync('cookie') 有数据,是一个数组格式的

nondanee commented 5 years ago

@estoi 那应该要做一下 .join('; ') 吧(是分号)

estoi commented 5 years ago

@nondanee 尝试过join(';') 在network request header 里面可以看到cookie 但是 debug里面cookie还是空

nondanee commented 5 years ago

试试看在 app.js#L37-38 加上 console.log(req.headers.cookie) 输出一下 cookie

estoi commented 5 years ago

:disappointed_relieved: undefined

{ host: 'localhost:6324', connection: 'close' }

@nondanee

nondanee commented 5 years ago

@estoi 那应该就是你自己的问题咯😂,截个 network request header 的图看看(记得打码)

estoi commented 5 years ago
wx20181129-150319 2x

@nondanee

nondanee commented 5 years ago

@estoi 格式不对哈 你应该是直接用了 response header set-cookie 的数据 在 request header 里要处理一下,把 expires, path, httponly 去掉 (这些是给浏览器存储 cookie 的参数) 正确格式应该是 MUSIC_U=xxxx; __csrf=xxxx; ... 这样的

可以看一下 MDN 的资料 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cookie https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#The_Set-Cookie_and_Cookie_headers

estoi commented 5 years ago

@nondanee thanks! 我去试试:+1:

estoi commented 5 years ago

image @nondanee 按照你说的格式 还是不行呀

nondanee commented 5 years ago

@estoi 这样吧,你从 music.163.com 复制一个 cookie 过来硬编码填进去试试看可不可以

wnpllrzodiac commented 5 years ago

我在 Android端也遇到了类似的问题,传了cookie也不起作用。再浏览器里倒是可以的,觉得还是兼容性问题

smartlabYuMengQiu commented 5 years ago

music.163.com 复制一个 cookie ,在微信小程序里设置了cookies也没有

Younglina commented 5 years ago

把登陆成功以后的这个 res.header['set-cookie'] 存起来,调用要登陆的接口的时候 header: { cookie: 获取你存起来的变量 } 这样应该就行了,我成功了。 image

Binaryify commented 5 years ago

代码都是可以改的,可以把 cookies 存到本地变量,发送请求的时候再带出去