aboutsummaryrefslogtreecommitdiff
path: root/backend/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/main.go')
-rw-r--r--backend/main.go54
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)