4.27.2: Улучшение отладки OAuth Fitbit
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m24s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 1m24s
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -10367,6 +10367,8 @@ func (a *App) fitbitOAuthConnectHandler(w http.ResponseWriter, r *http.Request)
|
||||
|
||||
// fitbitOAuthCallbackHandler обрабатывает OAuth callback от Fitbit
|
||||
func (a *App) fitbitOAuthCallbackHandler(w http.ResponseWriter, r *http.Request) {
|
||||
log.Printf("Fitbit OAuth callback: received request, URL=%s", r.URL.String())
|
||||
|
||||
frontendURL := getEnv("WEBHOOK_BASE_URL", "")
|
||||
redirectSuccess := frontendURL + "/?integration=fitbit&status=connected"
|
||||
redirectError := frontendURL + "/?integration=fitbit&status=error"
|
||||
@@ -10375,43 +10377,57 @@ func (a *App) fitbitOAuthCallbackHandler(w http.ResponseWriter, r *http.Request)
|
||||
clientSecret := getEnv("FITBIT_CLIENT_SECRET", "")
|
||||
baseURL := getEnv("WEBHOOK_BASE_URL", "")
|
||||
|
||||
log.Printf("Fitbit OAuth callback: WEBHOOK_BASE_URL=%s, FITBIT_CLIENT_ID set=%v, FITBIT_CLIENT_SECRET set=%v",
|
||||
baseURL, clientID != "", clientSecret != "")
|
||||
|
||||
if clientID == "" || clientSecret == "" || baseURL == "" {
|
||||
log.Printf("Fitbit OAuth: missing configuration")
|
||||
log.Printf("Fitbit OAuth: missing configuration (clientID=%v, clientSecret=%v, baseURL=%v)",
|
||||
clientID != "", clientSecret != "", baseURL != "")
|
||||
http.Redirect(w, r, redirectError+"&message=config_error", http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
|
||||
redirectURI := strings.TrimRight(baseURL, "/") + "/api/integrations/fitbit/oauth/callback"
|
||||
log.Printf("Fitbit OAuth callback: redirectURI=%s", redirectURI)
|
||||
|
||||
// Проверяем state
|
||||
state := r.URL.Query().Get("state")
|
||||
userID, err := validateFitbitOAuthState(state, a.jwtSecret)
|
||||
if err != nil {
|
||||
log.Printf("Fitbit OAuth: invalid state: %v", err)
|
||||
log.Printf("Fitbit OAuth: invalid state: %v (state length=%d)", err, len(state))
|
||||
http.Redirect(w, r, redirectError+"&message=invalid_state", http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("Fitbit OAuth callback: validated state, user_id=%d", userID)
|
||||
|
||||
// Получаем code
|
||||
code := r.URL.Query().Get("code")
|
||||
if code == "" {
|
||||
log.Printf("Fitbit OAuth: no code in callback")
|
||||
// Проверяем наличие ошибки от Fitbit
|
||||
fitbitError := r.URL.Query().Get("error")
|
||||
fitbitErrorDesc := r.URL.Query().Get("error_description")
|
||||
log.Printf("Fitbit OAuth: no code in callback, error=%s, error_description=%s", fitbitError, fitbitErrorDesc)
|
||||
http.Redirect(w, r, redirectError+"&message=no_code", http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("Fitbit OAuth callback: got code, exchanging for tokens...")
|
||||
|
||||
// Обмениваем code на токены
|
||||
accessToken, refreshToken, expiresIn, err := exchangeFitbitCodeForToken(code, redirectURI, clientID, clientSecret)
|
||||
if err != nil {
|
||||
log.Printf("Fitbit OAuth: token exchange failed: %v", err)
|
||||
log.Printf("Fitbit OAuth: token exchange failed for user_id=%d: %v", userID, err)
|
||||
http.Redirect(w, r, redirectError+"&message=token_exchange_failed", http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("Fitbit OAuth callback: token exchange successful, expiresIn=%d", expiresIn)
|
||||
|
||||
// Получаем информацию о пользователе
|
||||
fitbitUserID, err := getFitbitUserInfo(accessToken)
|
||||
if err != nil {
|
||||
log.Printf("Fitbit OAuth: get user info failed: %v", err)
|
||||
log.Printf("Fitbit OAuth: get user info failed for user_id=%d: %v", userID, err)
|
||||
http.Redirect(w, r, redirectError+"&message=user_info_failed", http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
@@ -10434,11 +10450,13 @@ func (a *App) fitbitOAuthCallbackHandler(w http.ResponseWriter, r *http.Request)
|
||||
`, userID, fitbitUserID, accessToken, refreshToken, tokenExpiresAt)
|
||||
|
||||
if err != nil {
|
||||
log.Printf("Fitbit OAuth: DB error: %v", err)
|
||||
log.Printf("Fitbit OAuth: DB error for user_id=%d: %v", userID, err)
|
||||
http.Redirect(w, r, redirectError+"&message=db_error", http.StatusTemporaryRedirect)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("Fitbit OAuth: successfully saved integration for user_id=%d, redirecting to %s", userID, redirectSuccess)
|
||||
|
||||
// Редирект на страницу интеграций
|
||||
http.Redirect(w, r, redirectSuccess, http.StatusTemporaryRedirect)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user