You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中window.addEventListener('message')未触发,Spotify访问令牌获取失败

解决Spotify授权后message事件监听器不触发的问题

嘿,我之前做Spotify授权功能的时候也踩过一模一样的坑!你的window.addEventListener('message')没触发,核心问题是你打开的授权回调页面根本没主动向主窗口发送消息,另外还有几个小细节需要调整,咱们一步步来搞定:

1. 给回调页面添加postMessage逻辑

你现在的代码只在主窗口监听了message事件,但当Spotify授权完成跳转到http://localhost:8080/spotify后,这个回调页面完全没给父窗口(打开它的那个页面)发任何信号,主窗口的监听器自然收不到东西。

赶紧在你的回调页面(http://localhost:8080/spotify)里加上这段脚本:

window.addEventListener('load', () => {
  // 从URL哈希里提取Spotify返回的令牌数据
  const hashParams = window.location.hash.slice(1).split('&').reduce((acc, param) => {
    const [key, value] = param.split('=');
    acc[key] = decodeURIComponent(value);
    return acc;
  }, {});

  // 确认拿到access_token后,向父窗口发送消息
  if (hashParams.access_token) {
    // 第二个参数要和主窗口的origin一致,生产环境别用'*'
    window.opener.postMessage(
      JSON.stringify({
        type: 'access_token',
        access_token: hashParams.access_token
      }),
      'http://localhost:8080'
    );
    // 发送完成后关闭授权窗口
    window.close();
  }
});

2. 修复授权URL中的HTML实体问题

你代码里的getLoginURL函数用了&来拼接URL参数,这是HTML的转义字符,在JavaScript里直接用&就可以了,不然会导致URL参数解析错误:

function getLoginURL(scopes) { 
  console.log('url') 
  return 'https://accounts.spotify.com/authorize?client_id=' + CLIENT_ID + '&redirect_uri=' + encodeURIComponent(REDIRECT_URI) + '&scope=' + encodeURIComponent(scopes.join(' ')) + '&response_type=token'; 
}

3. 给message监听器加上来源校验(可选但推荐)

为了安全,防止恶意网站发送垃圾消息,你可以在主窗口的监听器里校验消息的来源origin:

window.addEventListener("message", function(event) {
  // 只接受来自本地开发服务器的消息
  if (event.origin !== 'http://localhost:8080') return;

  var hash = JSON.parse(event.data); 
  console.log(hash)
  if (hash.type == 'access_token') {
    callback(hash.access_token); 
  }
}, false);

做完这几步再测试一下——授权完成后回调页会自动发消息给主窗口,你的监听器就能顺利捕获到access_token啦!

内容的提问来源于stack exchange,提问作者Caelou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:57:27