OAuth2 无法 return 使用 simple-oauth2 和 Firebase 函数进行 Spotify 身份验证的身份验证令牌
OAuth2 fails to return auth token using simple-oauth2 and Firebase Functions for Spotify Authentication
我一直在按照 Firebase 团队为 Instagram 提供的类似教程为 spotify 开发一个 oauth2 流程 HERE
我可以在 url 中提交我的凭据和 return 用户代码和状态,但是当我 运行 提交代码的方法时 return 一个身份验证令牌,我在 Firebase 函数 returns: Auth Token Error Not Found
中打印到控制台的身份验证令牌。这是我的工作流程:
首先,我有一个配置我的 spotifyOAuth 的功能:
function spotifyOAuth2Client() {
// Spotify OAuth 2 setup
const credentials = {
client: {
id: functions.config().spotify.clientid,
secret: functions.config().spotify.clientsecret,
},
auth: {
tokenHost: 'https://accounts.spotify.com',
authorizePath: '/authorize'
},
};
return require('simple-oauth2').create(credentials);
}
我在使用 https://us-central1-<my project string>.cloudfunctions.net/redirect
调用的这个 Firebase 函数中使用了该函数:
exports.redirect = functions.https.onRequest((req, res) => {
const oauth2 = spotifyOAuth2Client();
cookieParser()(req, res, () => {
const state = req.cookies.state || crypto.randomBytes(20).toString('hex');
console.log('Setting verification state:', state);
res.cookie('state', state.toString(), {
maxAge: 3600000,
secure: true,
httpOnly: true,
});
const redirectUri = oauth2.authorizationCode.authorizeURL({
redirect_uri: OAUTH_REDIRECT_URI,
//scope: OAUTH_SCOPES,
state: state,
});
console.log('Redirecting to:', redirectUri);
res.redirect(redirectUri);
});
});
上面的代码 return 是一个 url 带有适当参数的字符串,下面的代码块是我的代码中断的地方,我有另一个云函数 运行 被重定向后来自上面的res.redirect(redirectUri)
。当我尝试 运行 getToken()
方法时,它似乎没有 return 任何东西,因为我点击了 catch 块?这是我观察 Auth Token Error Not Found
.
的地方
const oauth2 = spotifyOAuth2Client();
try {
return cookieParser()(req, res, async () => {
console.log('Received verification state:', req.cookies.state);
console.log('Received state:', req.query.state);
if (!req.cookies.state) {
throw new Error('State cookie not set or expired. Maybe you took too long to authorize. Please try again.');
} else if (req.cookies.state !== req.query.state) {
throw new Error('State validation failed');
}
console.log('Received auth code:', req.query.code);
console.log(OAUTH_REDIRECT_URI);
// Get the access token object (the authorization code is given from the previous step).
const tokenConfig = {
code: req.query.code,
redirect_uri: 'http://localhost:8100/popup'
};
// Save the access token
try {
const result = await oauth2.authorizationCode.getToken(tokenConfig)
const accessToken = oauth2.accessToken.create(result);
console.log('inside try');
console.log(result);
console.log(accessToken);
} catch (error) {
console.log('Access Token Error', error.message);
}
我已经在配置中仔细检查了我的 spotify client/secret 凭据,这个 OAuth2 流程出了什么问题?
解决了我的问题,我没有使用正确的端点:
const credentials = {
client: {
id: functions.config().spotify.clientid,
secret: functions.config().spotify.clientsecret,
},
auth: {
tokenHost: 'https://accounts.spotify.com',
authorizePath: '/authorize',
tokenPath: '/api/token'
},
};
我一直在按照 Firebase 团队为 Instagram 提供的类似教程为 spotify 开发一个 oauth2 流程 HERE
我可以在 url 中提交我的凭据和 return 用户代码和状态,但是当我 运行 提交代码的方法时 return 一个身份验证令牌,我在 Firebase 函数 returns: Auth Token Error Not Found
中打印到控制台的身份验证令牌。这是我的工作流程:
首先,我有一个配置我的 spotifyOAuth 的功能:
function spotifyOAuth2Client() {
// Spotify OAuth 2 setup
const credentials = {
client: {
id: functions.config().spotify.clientid,
secret: functions.config().spotify.clientsecret,
},
auth: {
tokenHost: 'https://accounts.spotify.com',
authorizePath: '/authorize'
},
};
return require('simple-oauth2').create(credentials);
}
我在使用 https://us-central1-<my project string>.cloudfunctions.net/redirect
调用的这个 Firebase 函数中使用了该函数:
exports.redirect = functions.https.onRequest((req, res) => {
const oauth2 = spotifyOAuth2Client();
cookieParser()(req, res, () => {
const state = req.cookies.state || crypto.randomBytes(20).toString('hex');
console.log('Setting verification state:', state);
res.cookie('state', state.toString(), {
maxAge: 3600000,
secure: true,
httpOnly: true,
});
const redirectUri = oauth2.authorizationCode.authorizeURL({
redirect_uri: OAUTH_REDIRECT_URI,
//scope: OAUTH_SCOPES,
state: state,
});
console.log('Redirecting to:', redirectUri);
res.redirect(redirectUri);
});
});
上面的代码 return 是一个 url 带有适当参数的字符串,下面的代码块是我的代码中断的地方,我有另一个云函数 运行 被重定向后来自上面的res.redirect(redirectUri)
。当我尝试 运行 getToken()
方法时,它似乎没有 return 任何东西,因为我点击了 catch 块?这是我观察 Auth Token Error Not Found
.
const oauth2 = spotifyOAuth2Client();
try {
return cookieParser()(req, res, async () => {
console.log('Received verification state:', req.cookies.state);
console.log('Received state:', req.query.state);
if (!req.cookies.state) {
throw new Error('State cookie not set or expired. Maybe you took too long to authorize. Please try again.');
} else if (req.cookies.state !== req.query.state) {
throw new Error('State validation failed');
}
console.log('Received auth code:', req.query.code);
console.log(OAUTH_REDIRECT_URI);
// Get the access token object (the authorization code is given from the previous step).
const tokenConfig = {
code: req.query.code,
redirect_uri: 'http://localhost:8100/popup'
};
// Save the access token
try {
const result = await oauth2.authorizationCode.getToken(tokenConfig)
const accessToken = oauth2.accessToken.create(result);
console.log('inside try');
console.log(result);
console.log(accessToken);
} catch (error) {
console.log('Access Token Error', error.message);
}
我已经在配置中仔细检查了我的 spotify client/secret 凭据,这个 OAuth2 流程出了什么问题?
解决了我的问题,我没有使用正确的端点:
const credentials = {
client: {
id: functions.config().spotify.clientid,
secret: functions.config().spotify.clientsecret,
},
auth: {
tokenHost: 'https://accounts.spotify.com',
authorizePath: '/authorize',
tokenPath: '/api/token'
},
};