Spotify 用户授权禁止错误

问题描述 投票:0回答:1

我正在使用 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 秒(代码过期)后,它仅再次工作一次并重复此模式。

java spring-boot debugging authorization spotify
1个回答
0
投票

我认为您将应用程序的身份验证和授权与 Spotify 的 API 身份验证和授权混合在一起。您的应用程序应该处理自己的用户身份验证,而不依赖于 Spotify。 您的应用程序是 Spotify 客户端,因此它必须有客户端 ID 和密钥。这样您就必须获取访问代码并刷新代码。稍后您应该使用刷新代码更新您的访问代码。这是标准的基本 OAuth 流程。

从代码中,我可以看出您正在尝试在 Spotify 中创建用户。为什么你必须这样做?如果您可以详细说明您的用例,也许我可以提供更好的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.