11import { Form } from 'react-router'
22import { type EpicExecutionContext } from 'workers/app.ts'
3+ import { z } from 'zod'
34import { type Route } from './+types/authorize'
45
56export function meta ( { } : Route . MetaArgs ) {
@@ -14,6 +15,35 @@ export async function loader({ context }: Route.LoaderArgs) {
1415 return { users }
1516}
1617
18+ const requestParamsSchema = z
19+ . object ( {
20+ response_type : z . string ( ) . default ( 'code' ) ,
21+ client_id : z . string ( ) ,
22+ code_challenge : z . string ( ) ,
23+ code_challenge_method : z . string ( ) ,
24+ redirect_uri : z . string ( ) ,
25+ scope : z . string ( ) . array ( ) . optional ( ) . default ( [ ] ) ,
26+ state : z . string ( ) . optional ( ) . default ( '' ) ,
27+ } )
28+ . passthrough ( )
29+ . transform (
30+ ( {
31+ response_type : responseType ,
32+ client_id : clientId ,
33+ code_challenge : codeChallenge ,
34+ code_challenge_method : codeChallengeMethod ,
35+ redirect_uri : redirectUri ,
36+ ...val
37+ } ) => ( {
38+ responseType,
39+ clientId,
40+ codeChallenge,
41+ codeChallengeMethod,
42+ redirectUri,
43+ ...val ,
44+ } ) ,
45+ )
46+
1747export async function action ( { request, context } : Route . ActionArgs ) {
1848 const formData = await request . formData ( )
1949 const selectedUserId = formData . get ( 'userId' )
@@ -28,30 +58,12 @@ export async function action({ request, context }: Route.ActionArgs) {
2858 return { status : 'error' , message : 'User not found' } as const
2959 }
3060
31- // Get the OAuth request info from the URL parameters
3261 const url = new URL ( request . url )
33- const oauthReqInfo = url . searchParams . get ( 'oauth_req_info' )
3462
35- if ( ! oauthReqInfo ) {
36- return {
37- status : 'error' ,
38- message : 'Missing OAuth request information' ,
39- } as const
40- }
41-
42- // Parse the OAuth request info
43- let requestParams
44- try {
45- requestParams = JSON . parse ( oauthReqInfo )
46- } catch ( error ) {
47- console . error ( 'Invalid OAuth request information' , error )
48- return {
49- status : 'error' ,
50- message : 'Invalid OAuth request information' ,
51- } as const
52- }
63+ const requestParams = requestParamsSchema . parse (
64+ Object . fromEntries ( url . searchParams ) ,
65+ )
5366
54- // Complete the authorization
5567 const { redirectTo } =
5668 await context . cloudflare . env . OAUTH_PROVIDER . completeAuthorization ( {
5769 request : requestParams ,
@@ -182,20 +194,7 @@ export default function Authorize({
182194 href = { actionData . redirectTo }
183195 className = "inline-flex items-center rounded-md bg-green-600 px-4 py-2 text-sm font-medium text-white hover:bg-green-700 focus:ring-2 focus:ring-green-500 focus:ring-offset-2 focus:outline-none dark:bg-green-500 dark:hover:bg-green-600 dark:focus:ring-green-400"
184196 >
185- < svg
186- className = "mr-2 h-4 w-4"
187- fill = "none"
188- stroke = "currentColor"
189- viewBox = "0 0 24 24"
190- >
191- < path
192- strokeLinecap = "round"
193- strokeLinejoin = "round"
194- strokeWidth = { 2 }
195- d = "M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
196- />
197- </ svg >
198- Continue to Application
197+ < small className = "text-xs" > { actionData . redirectTo } </ small >
199198 </ a >
200199 </ div >
201200 </ div >
0 commit comments