aboutsummaryrefslogtreecommitdiff
path: root/backend/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/main.go')
-rw-r--r--backend/main.go45
1 files changed, 34 insertions, 11 deletions
diff --git a/backend/main.go b/backend/main.go
index 6598266..032c6e9 100644
--- a/backend/main.go
+++ b/backend/main.go
@@ -9,6 +9,7 @@ import (
"os"
"strings"
"sync"
+ "time"
"github.com/joho/godotenv"
)
@@ -175,6 +176,7 @@ func callbackHandler(w http.ResponseWriter, r *http.Request) {
PDS: oauthState.PDS,
AccessToken: tokens.AccessToken,
RefreshToken: tokens.RefreshToken,
+ ExpiresAt: time.Now().Add(time.Duration(tokens.ExpiresIn) * time.Second),
KeyPair: oauthState.KeyPair,
}
delete(sessions, state) // remove the partial oauth state from login
@@ -243,21 +245,42 @@ func postsHandler(w http.ResponseWriter, r *http.Request) {
sessionsMutex.RLock()
session, exists := sessions[cookie.Value]
+ if !exists {
+ sessionsMutex.RUnlock()
+ http.Error(w, "invalid session", http.StatusUnauthorized)
+ return
+ }
+
fmt.Printf("Session exists: %v\n", exists)
- if exists {
- fmt.Printf("Session DID: %s\n", session.DID)
- fmt.Printf("Session PDS: %s\n", session.PDS)
- fmt.Printf("Session AccessToken length: %d\n", len(session.AccessToken))
- fmt.Printf("Session KeyPair: %p\n", session.KeyPair)
- if session.KeyPair != nil {
- fmt.Printf("KeyPair PublicKey: %p\n", session.KeyPair.PublicKey)
- }
+ fmt.Printf("Session DID: %s\n", session.DID)
+ fmt.Printf("Session PDS: %s\n", session.PDS)
+ fmt.Printf("Session AccessToken length: %d\n", len(session.AccessToken))
+ fmt.Printf("Session KeyPair: %p\n", session.KeyPair)
+ if session.KeyPair != nil {
+ fmt.Printf("KeyPair PublicKey: %p\n", session.KeyPair.PublicKey)
}
+
+ needsRefresh := time.Now().After(session.ExpiresAt)
+ pds := session.PDS
+ refreshToken := session.RefreshToken
+ keypair := session.KeyPair
sessionsMutex.RUnlock()
- if !exists {
- http.Error(w, "invalid session", http.StatusUnauthorized)
- return
+ if needsRefresh {
+ newTokens, err := auth.RefreshAccessToken(pds, refreshToken, 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()
}
posts, err := fetchers.FetchAppBskyFeedPosts(session.DID, session.PDS, session.AccessToken, session.KeyPair)