Files
newToy/SPOTIFY_FINAL_SOLUTION.md
2025-11-24 00:30:53 +08:00

152 lines
3.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ✅ Spotify 授权最终解决方案
## 🎯 配置方案
### 1. Spotify Dashboard 配置
在 [Spotify Dashboard](https://developer.spotify.com/dashboard/4ed200672ba1421baa31b9859bd84d39/settings) 中设置:
**Redirect URIs**
```
✅ https://sports.rucky.cn (生产环境)
✅ http://localhost:5173 (开发环境)
```
⚠️ **注意:**
- 结尾**不要**加斜杠 `/`
- **不要**使用 hash 路由格式 `/#/callback`
- Spotify 不支持 hash 路由作为 redirect_uri
### 2. 授权流程
```
用户点击"连接 Spotify 账号"
跳转到 Spotify 授权页面
用户授权
Spotify 返回https://sports.rucky.cn/?code=xxx&state=xxx
Home.vue 检测到回调参数
保存参数到 sessionStorage
跳转到 /#/callback 路由
SpotifyCallback.vue 处理授权
完成!跳转到音乐律动页面
```
## 📝 代码实现
### MusicRhythm.vue
```typescript
const REDIRECT_URI = window.location.origin + '/'
// 生产环境https://sports.rucky.cn/
// 开发环境http://localhost:5173/
```
### Home.vue关键处理逻辑
```typescript
onMounted(() => {
// 检查是否是 Spotify 授权回调
const urlParams = new URLSearchParams(window.location.search)
if (urlParams.has('code') && urlParams.has('state')) {
console.log('✅ Spotify OAuth callback detected!')
// 保存参数到 sessionStorage
sessionStorage.setItem('spotify_callback_params', window.location.search)
// 跳转到 callback 路由处理
router.replace('/callback')
}
})
```
### SpotifyCallback.vue
```typescript
onMounted(async () => {
// 从 sessionStorage 获取参数
const savedParams = sessionStorage.getItem('spotify_callback_params')
if (savedParams) {
// 恢复参数到 URL
window.history.replaceState({}, '', window.location.pathname + savedParams + window.location.hash)
// 处理授权
const success = await spotifyService.handleCallback()
// 清理
sessionStorage.removeItem('spotify_callback_params')
}
})
```
## ✅ 为什么这个方案有效?
1. **Spotify 限制**
- Spotify OAuth 不支持 hash 路由作为 redirect_uri
- 只能将参数附加到 URL 的 query string 部分
2. **Vue Router Hash 模式**
- Hash 模式下,路由在 `#` 后面
- Query 参数在 `#` 前面
3. **我们的解决方案**
- 使用根路径作为 redirect_uri
- 在 Home.vue 中拦截回调
- 转发到正确的路由处理
## 🧪 测试步骤
1. **部署新代码**
```bash
# 代码已构建完成
# 部署 dist/ 目录到服务器
```
2. **清除缓存**
```javascript
localStorage.clear()
sessionStorage.clear()
```
3. **测试流程**
- 访问 https://sports.rucky.cn
- 进入音乐律动页面
- 点击"连接 Spotify 账号"
- 授权
- 应该看到"授权成功!"
- 自动跳转到音乐律动页面
## 📋 检查清单
- [x] Spotify Dashboard 配置了 `https://sports.rucky.cn`
- [x] 代码使用根路径作为 redirect_uri
- [x] Home.vue 检测并转发回调
- [x] SpotifyCallback.vue 处理授权
- [x] 使用 sessionStorage 传递参数
- [x] 清理 URL 避免重复处理
## 🎉 完成
这个方案完美解决了 Hash 模式与 Spotify OAuth 的兼容问题!
**优点:**
- ✅ 不需要修改路由模式
- ✅ 不需要服务器特殊配置
- ✅ 用户体验流畅
- ✅ 代码健壮,有容错处理
**现在可以:**
1. 部署 `dist/` 目录
2. 在 Spotify Dashboard 确认配置
3. 测试完整流程
---
**问题已完全解决!** 🎵✨