Skip to content

Commit 259af84

Browse files
committed
fix: refresh token not working
1 parent 4b9aebd commit 259af84

5 files changed

Lines changed: 16 additions & 20 deletions

File tree

app/api/auth/refreshToken/route.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import axios, { AxiosError } from 'axios';
22

33
import { NextResponse } from 'next/server';
4+
import { decrypt, encrypt } from '@/app/lib/utils';
45
import { getUser } from '@/app/lib/spotify';
56

67
const client_id = process.env.SPOTIFY_CLIENT_ID;
78
const client_secret = process.env.SPOTIFY_CLIENT_SECRET;
89

910
export async function POST(req: Request) {
1011
const res = await req.json();
11-
const refreshToken = res.refresh_token;
12+
const refreshToken = decrypt(res.refresh_token);
1213

1314
if (!refreshToken) {
1415
return NextResponse.json({ error: 'Invalid request' }, { status: 400 });
@@ -37,7 +38,7 @@ export async function POST(req: Request) {
3738
const { access_token, refresh_token, expires_in } = response.data;
3839
const user = await getUser(access_token);
3940
return NextResponse.json(
40-
{ expires_in, refresh_token, access_token, user },
41+
{ expires_in, refresh_token: encrypt(refresh_token), access_token, user },
4142
{ status: 200 },
4243
);
4344
} catch (error) {

app/api/auth/route.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import axios, { AxiosError } from "axios";
22

33
import { NextResponse } from "next/server";
4+
import { encrypt } from '@/app/lib/utils';
45
import { getUser } from '@/app/lib/spotify';
56
import prisma from '@/app/lib/prisma';
67

@@ -66,7 +67,7 @@ export async function POST(req: Request) {
6667
}
6768

6869
return NextResponse.json(
69-
{ expires_in, refresh_token, access_token, user },
70+
{ expires_in, refresh_token: encrypt(refresh_token), access_token, user },
7071
{ status: 200 },
7172
);
7273
} catch (error) {

app/components/ConnectSpotify/index.tsx

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use client';
22

33
import axios, { AxiosResponse } from 'axios';
4-
import { decrypt, encrypt } from '@/app/lib/utils';
54
import { useEffect, useRef, useState } from 'react';
65
import { usePathname, useRouter, useSearchParams } from 'next/navigation';
76

@@ -80,32 +79,30 @@ const ConnectSpotify = ({ authUrl }: { authUrl: string }) => {
8079

8180
try {
8281
if (getRefreshToken) {
83-
const refreshtoken = decrypt(getRefreshToken);
84-
85-
if (!refreshtoken || refreshtoken === '') {
86-
authInProgress(false);
87-
return;
88-
}
89-
9082
const response = await axios.post('/api/auth/refreshToken', {
91-
refresh_token: refreshtoken,
83+
refresh_token: getRefreshToken,
9284
});
9385
processResponse(response);
9486
} else {
9587
authInProgress(false);
9688
}
9789
} catch (error) {
98-
throw Error(error as string);
90+
console.error('Failed to refresh Spotify access token', error);
91+
authInProgress(false);
9992
}
10093
}
10194

102-
function storeToLocalStore(expires_in: number, refresh_token: string) {
95+
function storeToLocalStore(expires_in: number, refresh_token: string, access_token: string) {
10396
setExpires(expires_in);
10497

10598
const currentTime = Date.now();
10699
localStorage.setItem('expires', currentTime + expires_in * 1000 + '');
100+
if (access_token) {
101+
localStorage.setItem('access_token', access_token);
102+
}
107103
if (refresh_token === '' || !refresh_token) return;
108-
localStorage.setItem('refresh_token', encrypt(refresh_token));
104+
// refresh_token is already encrypted by the server
105+
localStorage.setItem('refresh_token', refresh_token);
109106
}
110107

111108
function setToSpotifyAPI(
@@ -118,7 +115,7 @@ const ConnectSpotify = ({ authUrl }: { authUrl: string }) => {
118115
spotifyApi.setAccessToken(access_token);
119116
spotifyApi.setRefreshToken(refresh_token);
120117

121-
storeToLocalStore(expires_in, refresh_token);
118+
storeToLocalStore(expires_in, refresh_token, access_token);
122119
}
123120

124121
function processResponse(response: AxiosResponse<any, any>) {

app/lib/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const API_KEY = process.env.NEXT_PUBLIC_API_KEY;
88
const genAI = new GoogleGenerativeAI(API_KEY as string);
99
const model = genAI.getGenerativeModel({ model: 'gemini-2.5-flash' });
1010

11-
const key = process.env.secretKey as string;
11+
const key = process.env.SECRET_KEY as string;
1212

1313
export const encrypt = (text: string): string => {
1414
return crypto.AES.encrypt(text, key).toString();

next.config.mjs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
const isProd = process.env.NODE_ENV === 'production'
22

33
const nextConfig = {
4-
env: {
5-
secretKey: process.env.SECRET_KEY,
6-
},
74
images: {
85
domains: ['i.scdn.co'],
96
},

0 commit comments

Comments
 (0)