diff options
Diffstat (limited to 'backend/main.go')
| -rw-r--r-- | backend/main.go | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/backend/main.go b/backend/main.go index 3c10887..234d57d 100644 --- a/backend/main.go +++ b/backend/main.go @@ -247,6 +247,34 @@ func sessionHandler(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } +func refreshTokens(session *auth.OAuthState, cookieValue string) error { + // Check for access token refresh + needsRefresh := time.Now().After(session.ExpiresAt) + pds := session.PDS + refreshToken := session.RefreshToken + keypair := session.KeyPair + sessionsMutex.RUnlock() + + if needsRefresh { + newTokens, err := auth.RefreshAccessToken(pds, refreshToken, backendURL+"/callback", keypair) + if err != nil { + sessionsMutex.Lock() + delete(sessions, cookieValue) + sessionsMutex.Unlock() + logger.Error("no authorization servers found for token refresh") + return fmt.Errorf("no authorization servers found") + } + + sessionsMutex.Lock() + session.AccessToken = newTokens.AccessToken + session.RefreshToken = newTokens.RefreshToken + session.ExpiresAt = time.Now().Add(time.Duration(newTokens.ExpiresIn) * time.Second) + sessionsMutex.Unlock() + } + + return nil +} + func postsHandler(w http.ResponseWriter, r *http.Request) { logger.Debug("posts handler start") @@ -272,32 +300,10 @@ func postsHandler(w http.ResponseWriter, r *http.Request) { logger.Debug("session public key", "key", session.KeyPair.PublicKey) } - // Check for access token refresh - needsRefresh := time.Now().After(session.ExpiresAt) - pds := session.PDS - refreshToken := session.RefreshToken - keypair := session.KeyPair - sessionsMutex.RUnlock() - - if needsRefresh { - newTokens, err := auth.RefreshAccessToken(pds, refreshToken, backendURL+"/callback", keypair) - if err != nil { - sessionsMutex.Lock() - delete(sessions, cookie.Value) - sessionsMutex.Unlock() - http.Error(w, "session expired, please login again", http.StatusUnauthorized) - return - } - - sessionsMutex.Lock() - session.AccessToken = newTokens.AccessToken - session.RefreshToken = newTokens.RefreshToken - session.ExpiresAt = time.Now().Add(time.Duration(newTokens.ExpiresIn) * time.Second) - sessionsMutex.Unlock() - } + refreshTokens(session, cookie.Value) // Fetch app.bsky.feed.post records - posts, err := fetchers.FetchAppBskyFeedPosts(logger, session.DID, session.PDS, slingshotURL, cache) + posts, err := fetchers.FetchAppBskyFeedPosts(logger, session.DID, session.PDS, slingshotURL, session, cache) if err != nil { logger.Error("fetching app.bsky.feed.posts failed", "error", err) http.Error(w, err.Error(), http.StatusInternalServerError) |
