Skip to content

Commit 759594e

Browse files
fix(auth): allow Solid login when IdP does not send refresh token
Rebase had reverted behavior: setOpenIDAuthTokens was returning early when !refreshToken, so session.openidTokens was never set and later requests failed with "No OpenID access token found". Restore: log a warning and continue storing access token in session; only set refreshToken cookie when present; keep correct if/else for session vs cookie fallback.
1 parent 99839d6 commit 759594e

1 file changed

Lines changed: 15 additions & 16 deletions

File tree

api/server/services/AuthService.js

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -451,8 +451,10 @@ const setOpenIDAuthTokens = (tokenset, req, res, userId, existingRefreshToken) =
451451
// Log warning if no refresh token, but continue with access token only
452452
// Some providers (like Solid) may not provide refresh tokens
453453
if (!refreshToken) {
454-
logger.error('[setOpenIDAuthTokens] No refresh token available');
455-
return;
454+
logger.warn('[setOpenIDAuthTokens] No refresh token available - will use access token only', {
455+
hasAccessToken: !!tokenset.access_token,
456+
provider: req.user?.provider,
457+
});
456458
}
457459

458460
/**
@@ -465,20 +467,17 @@ const setOpenIDAuthTokens = (tokenset, req, res, userId, existingRefreshToken) =
465467
const appAuthToken = tokenset.id_token || tokenset.access_token;
466468

467469
/**
468-
* Always set refresh token cookie so it survives express session expiry.
469-
* The session cookie maxAge (SESSION_EXPIRY, default 15 min) is typically shorter
470-
* than the OIDC token lifetime (~1 hour). Without this cookie fallback, the refresh
471-
* token stored only in the session is lost when the session expires, causing the user
472-
* to be signed out on the next token refresh attempt.
473-
* The refresh token is small (opaque string) so it doesn't hit the HTTP/2 header
474-
* size limits that motivated session storage for the larger access_token/id_token.
470+
* Set refresh token cookie when available so it survives express session expiry.
471+
* Some providers (e.g. Solid) may not issue refresh tokens; then we rely on session only.
475472
*/
476-
res.cookie('refreshToken', refreshToken, {
477-
expires: expirationDate,
478-
httpOnly: true,
479-
secure: shouldUseSecureCookie(),
480-
sameSite: 'strict',
481-
});
473+
if (refreshToken) {
474+
res.cookie('refreshToken', refreshToken, {
475+
expires: expirationDate,
476+
httpOnly: true,
477+
secure: shouldUseSecureCookie(),
478+
sameSite: 'strict',
479+
});
480+
}
482481

483482
/** Store tokens server-side in session to avoid large cookies */
484483
if (req.session) {
@@ -524,7 +523,7 @@ const setOpenIDAuthTokens = (tokenset, req, res, userId, existingRefreshToken) =
524523
secure: shouldUseSecureCookie(),
525524
sameSite: 'strict',
526525
});
527-
526+
528527
if (tokenset.id_token) {
529528
res.cookie('openid_id_token', tokenset.id_token, {
530529
expires: expirationDate,

0 commit comments

Comments
 (0)