Preload a CSRF token on the registration page
This commit is contained in:
		
							parent
							
								
									f68587419d
								
							
						
					
					
						commit
						b4cfd91ff4
					
				@ -5,10 +5,22 @@
 | 
			
		||||
import LoginForm from '@/app/ui/components/login-form';
 | 
			
		||||
import RegistrationForm from '@/app/ui/components/registration-form';
 | 
			
		||||
import { useParams } from 'next/navigation'
 | 
			
		||||
import { useEffect } from 'react';
 | 
			
		||||
import { retrieveCSRFToken } from '../api/authentication';
 | 
			
		||||
import { getCsrfToken } from '../lib/utils';
 | 
			
		||||
 | 
			
		||||
export default async function Page() {
 | 
			
		||||
  const params = useParams<{ slug: string }>()
 | 
			
		||||
  localStorage.setItem('slug', await params.slug);
 | 
			
		||||
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (getCsrfToken() == 'unknown') {
 | 
			
		||||
      retrieveCSRFToken();
 | 
			
		||||
    }
 | 
			
		||||
  }, []);
 | 
			
		||||
 | 
			
		||||
  if (typeof window !== 'undefined') {
 | 
			
		||||
    localStorage.setItem('slug', await params.slug);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <main className="flex min-h-screen flex-col p-6">
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@ export function logout({ onLogout }: { onLogout: () => void }) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function flattenErrors(errors: StructuredErrors): string[] {
 | 
			
		||||
  if(errors instanceof Array) {
 | 
			
		||||
  if (errors instanceof Array) {
 | 
			
		||||
    return errors;
 | 
			
		||||
  }
 | 
			
		||||
  return Object.keys(errors).map((key) => {
 | 
			
		||||
@ -43,7 +43,16 @@ function flattenErrors(errors: StructuredErrors): string[] {
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function register({slug, email, password, passwordConfirmation, captcha, onRegister, onError}: {
 | 
			
		||||
// At this moment we're making an initial request to get a valid CSRF token
 | 
			
		||||
export function retrieveCSRFToken() {
 | 
			
		||||
  return fetch(`/api/token`, {
 | 
			
		||||
    headers: {
 | 
			
		||||
      'Accept': 'application/json',
 | 
			
		||||
    }
 | 
			
		||||
  }).then((response) => { return null });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function register({ slug, email, password, passwordConfirmation, captcha, onRegister, onError }: {
 | 
			
		||||
  slug: string,
 | 
			
		||||
  email: string,
 | 
			
		||||
  password: string,
 | 
			
		||||
@ -51,7 +60,7 @@ export function register({slug, email, password, passwordConfirmation, captcha,
 | 
			
		||||
  captcha: Captcha,
 | 
			
		||||
  onRegister: () => void,
 | 
			
		||||
  onError: (errors: string[]) => void
 | 
			
		||||
}){
 | 
			
		||||
}) {
 | 
			
		||||
  fetch(`/api/${slug}/users`, {
 | 
			
		||||
    method: 'POST',
 | 
			
		||||
    body: JSON.stringify(
 | 
			
		||||
@ -66,7 +75,7 @@ export function register({slug, email, password, passwordConfirmation, captcha,
 | 
			
		||||
      'X-CSRF-TOKEN': getCsrfToken(),
 | 
			
		||||
    }
 | 
			
		||||
  }).then((response) => {
 | 
			
		||||
    if(response.ok) {
 | 
			
		||||
    if (response.ok) {
 | 
			
		||||
      response.json().then(onRegister);
 | 
			
		||||
    } else {
 | 
			
		||||
      response.json().then((data: any) => {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user