我正在使用 spotify API 和 springboot 创建一个项目,但在用户授权方面遇到一些问题。
问题:我只能授权一次,之后我必须等待 3600 秒才能使用同一帐户甚至不同的帐户进行身份验证,这是一个大问题。我在网上查找但找不到任何有效的解决方案。我想知道是否有人可以帮助我解决这个问题,或者甚至就我应该如何继续这个问题提供一些建议,我真的很感激。
我正在关注这个仓库:
github.com/spotify-web-api-java
@GetMapping("/login")
public ResponseEntity<Map<String, String>> spotifyLogin() {
try {
String state = generateRandomString(16);
stateStore.put(state, "pending");
SpotifyApi spotifyApi = spotifyConfiguration.getSpotifyObject();
AuthorizationCodeUriRequest authorizationCodeUriRequest = spotifyApi.authorizationCodeUri()
.scope("user-library-read user-top-read")
.state(state)
.show_dialog(true)
.build();
URI uri = authorizationCodeUriRequest.execute();
Map<String, String> response = new HashMap<>();
response.put("spotifyAuthUrl", uri.toString());
return ResponseEntity.ok(response);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Map.of("error", "Unexpected error: " + e.getMessage()));
}
}
@GetMapping("/callback")
public ResponseEntity<Map<String, Object>> getSpotifyUserCode(
@RequestParam("code") String userCode,
@RequestParam("state") String state) throws IOException, ParseException, SpotifyWebApiException {
try {
SpotifyApi spotifyApi = spotifyConfiguration.getSpotifyObject();
AuthorizationCodeRequest authorizationCodeRequest = spotifyApi.authorizationCode(userCode).build();
AuthorizationCodeCredentials authorizationCode = authorizationCodeRequest.execute();
spotifyApi.setAccessToken(authorizationCode.getAccessToken());
spotifyApi.setRefreshToken(authorizationCode.getRefreshToken());
GetCurrentUsersProfileRequest getCurrentUsersProfile = spotifyApi.getCurrentUsersProfile().build();
User user = getCurrentUsersProfile.execute();
if (userProfileService.userExists(user.getId())) {
if (userProfileService.isTokenExpired(user.getId())) {
spotifyApi = refreshAccessToken(userProfileService.getRefreshToken(user.getId()), user.getId());
}
}
userProfileService.InsertOrUpdateUserDetails(user, spotifyApi.getAccessToken(), spotifyApi.getRefreshToken());
Map<String, Object> responseData = new HashMap<>();
responseData.put("userId", user.getId());
responseData.put("username", user.getDisplayName());
responseData.put("email", user.getEmail());
responseData.put("accessToken", spotifyApi.getAccessToken());
responseData.put("refreshToken", spotifyApi.getRefreshToken());
responseData.put("country", user.getCountry());
responseData.put("displayName", user.getDisplayName());
return ResponseEntity.ok(responseData);
} catch (Exception e) {
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("error", "Error processing Spotify user code: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);
}
}
我尝试为每个用户添加随机生成的状态,并使用刷新令牌更新访问令牌,希望它能够正常工作,但它并没有真正执行任何操作。
第一次尝试:
第一次 API 调用:
/api/login
响应:redirectURI/code=""(按预期工作)
第二次 API 调用:
/api/callback?code=val1&state=val2
响应:正确返回包含用户详细信息(包括访问/刷新令牌)的 JSON
第二次尝试:
第一次 API 调用:
/api/login
响应:redirectURI/code=""(按预期工作)
第二次 API 调用:
/api/callback?code=val1&state=val2
回复:
{
"error": "Error processing Spotify user code: Forbidden"
}
PS:3600 秒(代码过期)后,它仅再次工作一次并重复此模式。
我认为您将应用程序的身份验证和授权与 Spotify 的 API 身份验证和授权混合在一起。您的应用程序应该处理自己的用户身份验证,而不依赖于 Spotify。 您的应用程序是 Spotify 客户端,因此它必须有客户端 ID 和密钥。这样您就必须获取访问代码并刷新代码。稍后您应该使用刷新代码更新您的访问代码。这是标准的基本 OAuth 流程。
从代码中,我可以看出您正在尝试在 Spotify 中创建用户。为什么你必须这样做?如果您可以详细说明您的用例,也许我可以提供更好的帮助。