Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(dbAuth): Refactor dbAuthHandler to support WebAPI Request events #9835

Merged
merged 45 commits into from
Jan 25, 2024
Merged
Changes from 1 commit
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
9e86135
Simple auth state parsing with middleware in entry server
dac09 Oct 25, 2023
5f1deed
NOT WORKING: try extracting session passed into a cookie
dac09 Oct 26, 2023
bb0b36e
Merge branch 'main' of github.com:redwoodjs/redwood into try/dbauth-ssr
dac09 Nov 2, 2023
9fafcf8
SHIP IT
dac09 Nov 2, 2023
2b66173
Get it building again
dac09 Nov 15, 2023
4bb543a
Merge branch 'main' of github.com:redwoodjs/redwood into try/dbauth-s…
dac09 Nov 15, 2023
a8f0e33
Fix some merged changes
dac09 Nov 15, 2023
37adfa5
Make it forward cookies from authState
dac09 Nov 20, 2023
0542ca7
Merge branch 'main' of github.com:redwoodjs/redwood into try/dbauth-s…
dac09 Dec 8, 2023
b275d9f
Fix building!
dac09 Dec 8, 2023
67c4ace
I think I have it working with failing tests
dac09 Dec 11, 2023
82badfd
Fix authContext tests and dbauth handler
dac09 Dec 20, 2023
3f0a32b
Fix more tests
dac09 Dec 22, 2023
0979725
Get it working with middleware!
dac09 Dec 22, 2023
1a3cbd4
Undo decoder type changes
dac09 Dec 22, 2023
fe40f61
Cleanup isFetchRequest
dac09 Dec 22, 2023
5e0c1c2
Change detection of fetch event
dac09 Dec 25, 2023
4e268aa
Refactor and reuse getEventHeader
dac09 Dec 25, 2023
e05a906
Add nx to gitignore
dac09 Dec 28, 2023
9b1affd
Merge branch 'main' of github.com:redwoodjs/redwood into feat/dbauth-…
dac09 Jan 2, 2024
d25ed51
Merge branch 'main' of github.com:redwoodjs/redwood into feat/dbauth-…
dac09 Jan 3, 2024
0d62479
ServerAuthState types and stuff
dac09 Jan 4, 2024
5ce1870
Merge branch 'main' of github.com:redwoodjs/redwood into feat/dbauth-…
dac09 Jan 9, 2024
be84ace
Restore unneeded changes
dac09 Jan 16, 2024
c3a2ebb
Merge branch 'main' of github.com:redwoodjs/redwood into feat/dbauth-…
dac09 Jan 16, 2024
6a31c00
Just keep the dbAuth fetch-api related changes, revert everything else
dac09 Jan 16, 2024
d773116
Merge main
dac09 Jan 18, 2024
8750800
FIX ALL THE TESTS!
dac09 Jan 18, 2024
3cdb37d
Update packages/auth-providers/dbAuth/api/src/decoder.ts
dac09 Jan 18, 2024
2bdb5e0
Cleanup, update shared.test
dac09 Jan 19, 2024
38b3584
Remove old comment
dac09 Jan 19, 2024
06c07dc
Undo bearer token change
dac09 Jan 19, 2024
bf2b589
Remove unused function
dac09 Jan 19, 2024
abf3a95
Merge branch 'main' into feat/dbauth-fetch-handler
dac09 Jan 19, 2024
7491bdf
Merge branch 'main' into feat/dbauth-fetch-handler
dac09 Jan 21, 2024
5900629
Merge branch 'main' of github.com:redwoodjs/redwood into feat/dbauth-…
dac09 Jan 21, 2024
b32eca7
Fix merge after vitest
dac09 Jan 21, 2024
61d4664
Merge branch 'feat/dbauth-fetch-handler' of github.com:dac09/redwood …
dac09 Jan 21, 2024
8fdbec0
Merge branch 'main' into feat/dbauth-fetch-handler
dac09 Jan 22, 2024
ed74729
Merge branch 'main' into feat/dbauth-fetch-handler
dac09 Jan 22, 2024
d4ce855
Merge branch 'main' into feat/dbauth-fetch-handler
dac09 Jan 22, 2024
d35207f
Remove this.init from inside class, call them in the tests instead
dac09 Jan 23, 2024
81b787f
Merge branch 'main' of github.com:redwoodjs/redwood into feat/dbauth-…
dac09 Jan 23, 2024
616bd22
Also convert fetch handler test to vitest
dac09 Jan 23, 2024
65e864a
Merge branch 'main' into feat/dbauth-fetch-handler
dac09 Jan 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Simple auth state parsing with middleware in entry server
  • Loading branch information
dac09 committed Oct 25, 2023
commit 9e8613504f0992bd13ba48e2bb52a6ab7d75e016
1 change: 1 addition & 0 deletions packages/api/src/auth/index.ts
Original file line number Diff line number Diff line change
@@ -76,6 +76,7 @@ export const getAuthenticationContext = async ({
}

const { schema, token } = parseAuthorizationHeader(event)
console.log(`👉 \n ~ file: index.ts:79 ~ token:`, token)

let authDecoders: Array<Decoder> = []

1 change: 1 addition & 0 deletions packages/auth-providers/dbAuth/api/src/decoder.ts
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@ export const createAuthDecoder = (cookieNameOption: string): Decoder => {
return null
}

// @TODO for SSR we need to make sure we are passing the cookie from the FE to the BE
const session = dbAuthSession(req.event, cookieNameOption)
const authHeaderUserId = token

7 changes: 5 additions & 2 deletions packages/auth/src/AuthProvider/AuthProvider.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import type { ReactNode } from 'react'
import React, { useEffect, useState } from 'react'
import React, { useContext, useEffect, useState } from 'react'

import type { AuthContextInterface, CurrentUser } from '../AuthContext'
import type { AuthImplementation } from '../AuthImplementation'

import type { AuthProviderState } from './AuthProviderState'
import { defaultAuthProviderState } from './AuthProviderState'
import { ServerAuthContext } from './ServerAuthProvider'
import { useCurrentUser } from './useCurrentUser'
import { useForgotPassword } from './useForgotPassword'
import { useHasRole } from './useHasRole'
@@ -82,9 +83,11 @@ export function createAuthProvider<
}: AuthProviderProps) => {
// const [hasRestoredState, setHasRestoredState] = useState(false)

const serverAuthState = useContext(ServerAuthContext)

const [authProviderState, setAuthProviderState] = useState<
AuthProviderState<TUser>
>(defaultAuthProviderState)
>(serverAuthState || defaultAuthProviderState)

const getToken = useToken(authImplementation)

10 changes: 10 additions & 0 deletions packages/auth/src/AuthProvider/ServerAuthProvider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from 'react'

import type { AuthProviderState } from './AuthProviderState'
import { defaultAuthProviderState } from './AuthProviderState'

export const ServerAuthContext = React.createContext<
AuthProviderState<never> | undefined
>(defaultAuthProviderState)

export const ServerAuthProvider = ServerAuthContext.Provider
2 changes: 2 additions & 0 deletions packages/auth/src/index.ts
Original file line number Diff line number Diff line change
@@ -2,3 +2,5 @@ export { AuthContextInterface, CurrentUser } from './AuthContext'
export { useNoAuth, UseAuth } from './useAuth'
export { createAuthentication } from './authFactory'
export type { AuthImplementation } from './AuthImplementation'

export * from './AuthProvider/ServerAuthProvider'
9 changes: 9 additions & 0 deletions packages/vite/src/streaming/createReactStreamingHandler.ts
Original file line number Diff line number Diff line change
@@ -50,6 +50,8 @@ export const createReactStreamingHandler = async (
})
}

let decodedAuthState

// Do this inside the handler for **dev-only**.
// This makes sure that changes to entry-server are picked up on refresh
if (!isProd) {
@@ -59,6 +61,12 @@ export const createReactStreamingHandler = async (
fallbackDocumentImport = await viteDevServer.ssrLoadModule(
rwPaths.web.document
)

const middleware = entryServerImport.middleware

if (middleware) {
decodedAuthState = await middleware(req)
}
}

const ServerEntry =
@@ -112,6 +120,7 @@ export const createReactStreamingHandler = async (
cssLinks,
isProd,
jsBundles,
authState: decodedAuthState,
},
{
waitForAllReady: isSeoCrawler,
25 changes: 18 additions & 7 deletions packages/vite/src/streaming/streamHelpers.ts
Original file line number Diff line number Diff line change
@@ -7,6 +7,8 @@ import type {
ReactDOMServerReadableStream,
} from 'react-dom/server'

import { ServerAuthProvider } from '@redwoodjs/auth'
import type { AuthProviderState } from '@redwoodjs/auth/src/AuthProvider/AuthProviderState'
import type { TagDescriptor } from '@redwoodjs/web'
// @TODO (ESM), use exports field. Cannot import from web because of index exports
import {
@@ -26,6 +28,7 @@ interface RenderToStreamArgs {
cssLinks: string[]
isProd: boolean
jsBundles?: string[]
authState?: AuthProviderState<never> | undefined
}

interface StreamOptions {
@@ -46,7 +49,9 @@ export async function reactRenderToStreamResponse(
cssLinks,
isProd,
jsBundles = [],
authState,
} = renderOptions
console.log(`👉 \n ~ file: streamHelpers.ts:54 ~ authState:`, authState)

if (!isProd) {
// For development, we need to inject the react-refresh runtime
@@ -84,15 +89,21 @@ export async function reactRenderToStreamResponse(

const renderRoot = (path: string) => {
return React.createElement(
ServerHtmlProvider,
ServerAuthProvider,
{
value: injectToPage,
value: authState,
},
ServerEntry({
url: path,
css: cssLinks,
meta: metaTags,
})
React.createElement(
ServerHtmlProvider,
{
value: injectToPage,
},
ServerEntry({
url: path,
css: cssLinks,
meta: metaTags,
})
)
)
}

11 changes: 0 additions & 11 deletions packages/web/src/components/ServerInject.tsx
Original file line number Diff line number Diff line change
@@ -70,14 +70,3 @@ export function useServerInsertedHTML(callback: () => React.ReactNode): void {
addInsertedServerHTMLCallback(callback)
}
}

// @TODO use this in streamHelpers final block
export const AppendToHead = ({ tagsToAppend }: { tagsToAppend: string }) => {
return (
<script
dangerouslySetInnerHTML={{
__html: `document?.head.append(${tagsToAppend})`,
}}
/>
)
}