Skip to content

Commit

Permalink
add session refresh logic
Browse files Browse the repository at this point in the history
  • Loading branch information
chantastic committed Jul 13, 2024
1 parent 9496144 commit 0d4435c
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 4 deletions.
75 changes: 74 additions & 1 deletion chan.dev/src/content/posts/authkit-astro.md
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,80 @@ try {
export const prerender = false
---

<h1>Hello {session.user.firstName} {session.user.lastName}!</h1>
<h1>Hello {session.user.first_name} {session.user.last_name}!</h1>
```

---

## Authomatically refresh session with session refreshToken

```diff lang="astro" title="src/pages/dashboard.astro ins=/sealData, /
---
import {WorkOS} from '@workos-inc/node'
import {createRemoteJWKSet, jwtVerify} from 'jose'

import {sealData, unsealData} from 'iron-session'

const cookie = Astro.cookies.get('wos-session')

if (!cookie) {
return Astro.redirect('/sign-in')
}

const session = await unsealData(cookie.value, {
password: import.meta.env.WORKOS_COOKIE_PASSWORD,
})

const workos = new WorkOS(import.meta.env.WORKOS_API_KEY)

const JWKS = createRemoteJWKSet(
new URL(
workos.userManagement.getJwksUrl(
import.meta.env.WORKOS_CLIENT_ID
)
)
)

let verifiedSession

try {
verifiedSession = await jwtVerify(session.accessToken, JWKS)
} catch (e) {
+ try {
+ const refreshedSession =
+ await workos.userManagement.authenticateWithRefreshToken({
+ clientId: import.meta.env.WORKOS_CLIENT_ID,
+ refreshToken: session.refreshToken,
+ })
+
+ const encryptedRefreshedSession = await sealData(
+ refreshedSession,
+ {
+ password: import.meta.env.WORKOS_COOKIE_PASSWORD,
+ }
+ )
+
+ Astro.cookies.set(
+ 'wos-session',
+ encryptedRefreshedSession,
+ {
+ path: '/',
+ httpOnly: true,
+ secure: true,
+ sameSite: 'lax',
+ }
+ )
+ } catch (e) {
return Astro.redirect('/sign-in')
+ }
}

export const prerender = false
---

<h1>
Hello {session.user.last_name}!
</h1>
```

## Extract auth check into framework middleware
34 changes: 31 additions & 3 deletions chan.dev/src/pages/dashboard.astro
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import {WorkOS} from '@workos-inc/node'
import {createRemoteJWKSet, jwtVerify} from 'jose'
import {unsealData} from 'iron-session'
import {sealData, unsealData} from 'iron-session'
const cookie = Astro.cookies.get('wos-session')
Expand All @@ -29,10 +29,38 @@ let verifiedSession
try {
verifiedSession = await jwtVerify(session.accessToken, JWKS)
} catch (e) {
return Astro.redirect('/sign-in')
try {
const refreshedSession =
await workos.userManagement.authenticateWithRefreshToken({
clientId: import.meta.env.WORKOS_CLIENT_ID,
refreshToken: session.refreshToken,
})
const encryptedRefreshedSession = await sealData(
refreshedSession,
{
password: import.meta.env.WORKOS_COOKIE_PASSWORD,
}
)
Astro.cookies.set(
'wos-session',
encryptedRefreshedSession,
{
path: '/',
httpOnly: true,
secure: true,
sameSite: 'lax',
}
)
} catch (e) {
return Astro.redirect('/sign-in')
}
}
export const prerender = false
---

<h1>Hello {session.user.firstName} {session.user.lastName}!</h1>
<h1>
Hello {session.user.last_name}!
</h1>

0 comments on commit 0d4435c

Please sign in to comment.