SvelteKit hCaptcha 연락처: 로봇 멀리하기

40244 단어 webdevsveltejavascript

📝 hCaptcha는 SvelteKit에서


이 글에서, 우리는 당신의 Svelte 사이트를 위해 SvelteKit hCaptcha 연락처를 볼 것입니다.hCaptcha는 Google reCAPTCHA의 대체 제품입니다.둘 다 사이트 리스트에 있는 스팸메일 제출을 줄일 수 있다.hCaptcha claims to protect user privacy . 사용자가 폼을 제출하기 전에 hCaptcha 도전을 완성하도록 요구함으로써, 당신은 hCaptcha 판결에 따라 답장을 선별하고 그것들을 더욱 심사할 수 있습니다.
hCaptcha 검증은 두 부분으로 나뉜다.첫 번째는 클라이언트(전단)에서 사용자에게 도전을 완성하도록 요구합니다.우리는 hCaptcha에 직접 사용자 질문 응답을 보냅니다.hCaptcha 다음에 응답 코드로 응답합니다.이 응답 코드는 프로세스의 두 번째 부분에서 사용해야 하며, 이 부분은 백엔드에서 완성되어야 한다.정적 SvelteKit 사이트를 구축하려면 Cloudflare workers를 사용하여 백엔드 부분을 실행하는 방법을 볼 수 있습니다.그러나 서버 쪽 렌더링을 더 좋아한다면, SvelteKit에서 이 문제를 처리할 수 있도록 예시 코드를 제공할 것입니다.
만약 이 모든 것이 듣기에 매우 감동적이라면, 우리는 왜 계속하지 않겠는가?
🧱 hCaptcha는 SvelteKit에서

영업 계획은 다음과 같습니다.
  • 클론 SvelteKit blog MDsveX starter, 이렇게 하면 우리는 달리기를 시작할 수 있습니다.
  • 연락처 양식 추가
  • hCaptcha 클라이언트 코드 추가
  • 은Cloudflare workers가 서버 측 검증에 어떻게 사용되는지 이해합니다.
  • 은 다른 서버에서 구현을 시도합니다.
  • ⚙️ 개시하다


    cloning the SvelteKit blog MDsveX starter부터 시작하겠습니다.
    git clone https://github.com/rodneylab/sveltekit-blog-mdx.git sveltekit-hcaptcha-form
    cd sveltekit-hcaptcha-form
    pnpm install
    cp .env.EXAMPLE .env
    pnpm run dev
    
    SvelteKit 구성 요소 라이브러리의 일부 구성 요소를 사용하여 개발을 가속화할 것입니다.이제 설치를 시작하겠습니다.
    pnpm install -D @rodneylab/sveltekit-components
    
    마지막으로, 코드를 테스트하려면 hCaptcha 증빙서류가 필요합니다.setting up a free hCaptcha account in the article on Serverless hCaptcha or just head to the hCaptcha site의 설명을 참조하십시오.자격 증명을 획득한 후 .env 파일에 추가합니다.
    VITE_HCAPTCHA_SITEKEY="10000000-ffff-ffff-ffff-000000000001"
    VITE_WORKER_URL="http://127.0.0.1:8787"
    
    HCAPTCHA_SECRETKEY="0x0000000000000000000000000000000000000000"
    
    클라이언트는 앞의 두 개의 증빙서류에 접근할 것이기 때문에 VITE_ 접두사가 필요합니다.
    마지막 설정으로 dotenv 파일에서 svelte.config.js 패키지를 가져오십시오.
    /** @type {import('@sveltejs/kit').Config} */
    import 'dotenv/config';
    import adapter from '@sveltejs/adapter-static';
    
    그런 다음 src/lib/config/website.js의 클라이언트 구성 요소에 액세스할 수 있습니다.
      wireUsername: import.meta.env ? import.meta.env.VITE_WIRE_USERNAME : '',
      hcaptchaSitekey: import.meta.env ? import.meta.env.VITE_HCAPTCHA_SITEKEY : '',
      workerUrl: import.meta.env ? import.meta.env.VITE_WORKER_URL : '',
    };
    
    설정에 따라 초보자를 처음 사용한다면 프로젝트의 파일과 폴더를 훑어보세요.localhost:3030/으로 가셔서 클릭해서 이 사이트를 익히셔도 됩니다.계속할 준비가 됐을 때

    ⚓️ 연결 구성


    우리는 모든 것이 순조롭게 운행될 수 있도록 연결고리의 배치만 조정할 수 있다.프로젝트의 src/hooks.js 파일에는 CSP(Content Security Policy) 헤더가 포함되어 있습니다.이러한 보안 조치는 브라우저만 특정 호스트에 연결할 수 있도록 하는 추가 보안 조치입니다.starter를 사용하여 구축된 모든 사이트에서 이 파일을 조정해야 할 수도 있습니다.이 프로젝트에 대해 hCaptcha와 Cloudflare worker에 연결할 수 있도록 허용해야 합니다.
    const directives = {
      'base-uri': ["'self'"],
      'child-src': ["'self'"],
      // 'connect-src': ["'self'", 'ws://localhost:*'],
      'connect-src': [
        "'self'",
        'ws://localhost:*',
        'https://hcaptcha.com',
        'https://*.hcaptcha.com',
        process.env['VITE_WORKER_URL'],
      ],
      'img-src': ["'self'", 'data:'],
      'font-src': ["'self'", 'data:'],
      'form-action': ["'self'"],
      'frame-ancestors': ["'self'"],
      'frame-src': [
        "'self'",
        // "https://*.stripe.com",
        // "https://*.facebook.com",
        // "https://*.facebook.net",
        'https://hcaptcha.com',
        'https://*.hcaptcha.com',
      ],
      'manifest-src': ["'self'"],
      'media-src': ["'self'", 'data:'],
      'object-src': ["'none'"],
      // 'style-src': ["'self'", "'unsafe-inline'"],
      'style-src': ["'self'", "'unsafe-inline'", 'https://hcaptcha.com', 'https://*.hcaptcha.com'],
      'default-src': [
        "'self'",
        rootDomain,
        `ws://${rootDomain}`,
        // 'https://*.google.com',
        // 'https://*.googleapis.com',
        // 'https://*.firebase.com',
        // 'https://*.gstatic.com',
        // 'https://*.cloudfunctions.net',
        // 'https://*.algolia.net',
        // 'https://*.facebook.com',
        // 'https://*.facebook.net',
        // 'https://*.stripe.com',
        // 'https://*.sentry.io',
      ],
      'script-src': [
        "'self'",
        "'unsafe-inline'",
        // 'https://*.stripe.com',
        // 'https://*.facebook.com',
        // 'https://*.facebook.net',
        'https://hcaptcha.com',
        'https://*.hcaptcha.com',
        // 'https://*.sentry.io',
        // 'https://polyfill.io',
      ],
      'worker-src': ["'self'"],
      // remove report-to & report-uri if you do not want to use Sentry reporting
      'report-to': ["'csp-endpoint'"],
      'report-uri': [
        `https://sentry.io/api/${import.meta.env.VITE_SENTRY_PROJECT_ID}/security/?sentry_key=${
          import.meta.env.VITE_SENTRY_KEY
        }`,
      ],
    };
    
    정적 사이트를 만들든 서버 사이드 구현 사이트를 만들든 개발 과정에서 변경해야 한다.정적 프로덕션 사이트에서는 이 파일을 사용하지 않습니다.같은 효과를 위해 HTTP 헤더를 추가할 수 있습니다.당신의 위탁 관리 플랫폼에서 어떻게 이 점을 실현할 수 있는지 검사하세요.

    🧑🏽 연락처


    이것은 기본 연락처의 코드다.우리는 폼에 접근할 수 있는 모든 보일러판을 입력하는 데 필요한 시간을 절약하기 위해 구성 요소 라이브러리를 사용하고 있습니다.너는 how to create you own SvelteKit component library in a recent video post을 볼 수 있다.src/lib/components/ContactForm.svelte의 새 파일에 코드를 붙여넣습니다.
    <script>
      import { EmailInputField, TextArea, TextInputField } from '@rodneylab/sveltekit-components';
      import website from '$lib/config/website';
      import { onMount, onDestroy } from 'svelte';
      import { browser } from '$app/env';
    
      const { hcaptchaSitekey, workerUrl } = website;
    
      onMount(() => {
    
      });
    
      onDestroy(() => {
    
      });
    
      let name = '';
      let email = '';
      let message = '';
      let errors: {
        name?: string;
        email?: string;
        message?: string;
      };
      $: errors = {};
      $: submitting = false;
    
      function clearFormFields() {
        name = '';
        email = '';
        message = '';
      }
    
    <form class="form" on:submit|preventDefault={handleSubmit}>
      <h2>Drop me a message</h2>
      <TextInputField
        id="form-name"
        value={name}
        placeholder="Your name"
        title="Name"
        error={errors?.name ?? null}
        on:update={(event) => {
          name = event.detail;
        }}
        style="padding-bottom:1rem"
      />
      <EmailInputField
        id="form-email"
        value={email}
        placeholder="[email protected]"
        title="Email"
        error={errors?.email ?? null}
        on:update={(event) => {
          email = event.detail;
        }}
        style="width:100%;padding-bottom:1rem"
      />
      <TextArea
        id="form-message"
        value={message}
        placeholder="Enter your message here"
        title="Message"
        error={errors?.message ?? null}
        on:update={(event) => {
          message = event.detail;
        }}
        style="padding-bottom:1rem"
      />
      <button type="submit" disabled={submitting}>Submit form</button>
    </form>
    
    <style lang="scss">
      .form {
        display: flex;
        flex-direction: column;
        width: 80%;
        margin: $spacing-6 auto;
      }
      button {
        cursor: pointer;
        padding: $spacing-2 $spacing-0;
      }
    </style>
    
    EmailInputField, TextArea, TextInputField 구성 요소는 구성 요소 라이브러리에서 나온다.make use of Svelte's component events으로 표시되는 값이 해당 구성 요소의 email, messagename 변수와 동기화됩니다.이 API에 익숙하지 않은 경우 앞의 링크에 따라 Svelte 자습서를 읽으십시오.
    이 글이 너무 길지 않도록, 우리는 여기서 표 코드의 나머지 부분을 상세하게 소개하지 않는다.날씬한 폼과 폼 필드를 변수에 연결하는 게시물을 단독으로 발표하고 싶다면 알려주세요.

    🤖 hCaptcha 추가


    클라이언트 hCaptcha 스크립트를 DOM에 직접 추가합니다.만약 이전에 추적이나 분석 코드를 보았다면, 아마도 이러한 모델을 보았을 것입니다.SvelteKit에서 이 점을 실현하기 위해 추가 패키지를 추가할 필요가 없다는 것을 볼 수 있습니다.그 전에 구성 요소 onMount 함수에 스크립트를 실제로 로드합니다.
      let hcaptcha = { execute: async (_a, _b) => ({ response: '' }), render: (_a, _b) => {} };
      let hcaptchaWidgetID;
    
      onMount(() => {
        if (browser) {
          hcaptcha = window.hcaptcha;
          if (hcaptcha.render) {
            hcaptchaWidgetID = hcaptcha.render('hcaptcha', {
              sitekey: hcaptchaSitekey,
              size: 'invisible',
              theme: 'dark',
            });
          }
        }
      });
    
      onDestroy(() => {
        if (browser) {
          hcaptcha = { execute: async () => ({ response: '' }), render: () => {} };
        }
      });
    
    보이지 않는 hCaptcha를 추가하고 있기 때문에 hcaptchaWidgetID 변수를 사용하여 식별할 것입니다.첫 번째 줄은 형식의 일치성을 유지하기 위해서이며, 구성 요소를 만들고 제거하는 동안 hCaptcha 스크립트를 국부 변수에 연결하고 링크를 취소할 수 있습니다.우리는 onMount 내의 hCaptcha 초기화에 우리의 hCaptcha 사이트 키를 추가했습니다.
    다음은 handleSubmit 함수가 필요합니다.
      async function handleSubmit() {
        try {
          const { response: hCaptchaResponse } = await hcaptcha.execute(hcaptchaWidgetID, {
            async: true,
          });
          /* for a static site, you can use a Cloudflare worker to manage the server part of the
           * hCaptcha and send your site admin an email with the contact details
           *
           * in this case, use:
           *
           * fetch(`${workerUrl}/verify`, {
           *
           * for a server side rendered app, use the verify endpoint to do the processing:
           *
           * fetch('/verify.json', {
           */
          fetch(`${workerUrl}/verify`, {
            method: 'POST',
            credentials: 'omit',
            headers: {
              'Content-Type': 'application/json',
            },
            body: JSON.stringify({
              name,
              email,
              message,
              response: hCaptchaResponse,
            }),
          });
          console.log('Details: ', { name, email, message });
          clearFormFields();
        } catch (error) {
          console.error('Error in contact form submission');
        }
      }
    </script>
    
    이 함수는 hcaptcha.execute 함수로 호출되기 시작한다.인증 코드를 표시하고 사용자가 완료할 때까지 기다립니다.그리고 hCaptcha에 연락해서 response을 받습니다. 이것은 저희가 두 번째 부분에서 필요로 하는 것입니다.흥미로운 것은 execute이 도전과 사용자 답변을 해결할 때 마우스 이동 정보를 수집한다는 점이다.
    이 함수의 나머지 부분은 두 가지 가능성을 포함한다.만약 정적 사이트가 있다면, 우리는 폼 데이터와 hCaptcha 응답을 클라우드flare worker에 보내서 처리할 수 있습니다.SvelteKit 순수주의자이고 서버에서 보이는 사이트를 선택하면 요청을 SvelteKit 노드로 보낼 수 있습니다.잠시 후에 이 두 가지 방법을 더욱 상세하게 이해합시다.
    앞에서 설명한 대로 HCaptcha 스크립트를 DOM에 추가할 수 있습니다.
    <svelte:head>
      <script src="https://js.hcaptcha.com/1/api.js?render=explicit" async defer></script>
    </svelte:head>
    
    그런 다음 다음과 같은 자리 표시자div가 필요합니다.
      <button type="submit" disabled={submitting}>Submit form</button>
      <div
        id="hcaptcha"
        class="h-captcha"
        data-sitekey={hcaptchaSitekey}
        data-size="invisible"
        data-theme="dark"
      />
    </form>
    

    🔗 SvelteKit hCaptcha 연락처: 모든 정보를 연결


    중요한 것은 연락처 페이지에 ContactForm 구성 요소를 가져와서 다음과 같이 보여야 한다는 것입니다.
      import ContactForm from '$lib/components/ContactForm.svelte';
    
      </div></Card
    >
    <ContactForm />
    
    <style lang="scss"
    

    🤖 hCaptcha 추가: Rust Cloudflare Worker Style


    Cloudflare workers는 WASM(Web Assembly) 환경에서 실행됩니다. 즉, JavaScript 대신 Rust 또는 C++로 코드를 작성할 수 있습니다.SvelteKit와 다른 프레임워크에서 클라이언트 사이트를 구축하려면 백엔드의 일부분을 위한 코드 라이브러리만 유지해야 하기 때문에 해결 방안으로 삼는 것을 좋아합니다.SvelteKit와Next 응용 프로그램에서 같은 코드를 사용하여 연락처 폼을 제출할 수 있습니다.Rust는 또한 코드 최적화의 기회를 제공합니다.최근 글에서 hCaptcha를 처리하기 위해 Rust Cloudflare 서비스 인원을 설정하는 방법을 볼 수 있습니다.로컬 테스트에 대해 워크맨을 http://127.0.0.1:8787에서 실행할 수 있습니다. 이것은 우리가 .env 파일에서 정의한 값입니다.POST 루트의 /verify 요청으로 설정하기만 하면 됩니다.

    🔥 hCaptcha 추가:SvelteKit 서버 사이드 라우팅 스타일


    마지막으로 hCaptcha 서버에서 일하는 SvelteKit 방법을 검사해 보겠습니다.src/routes/verify.json.js에 새 파일을 만들고 다음 코드를 붙여넣습니다.
    export async function post(request) {
      try {
        const { name, email, message, response: hCaptchaClientResponse } = request.body;
    
        const secret = process.env['HCAPTCHA_SECRETKEY'];
        const sitekey = process.env['VITE_HCAPTCHA_SITEKEY'];
        const body = new URLSearchParams({ response: hCaptchaClientResponse, secret, sitekey });
    
        const response = await fetch('https://hcaptcha.com/siteverify', {
          method: 'POST',
          credentials: 'omit',
          headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
          },
          body: body.toString(),
        });
    
        const data = await response.json();
        const { success } = data;
        console.log('data: ', data);
        if (success) {
          console.log('hCaptcha says yes!');
        } else {
          console.log('hCaptcha says no!');
        }
    
        // process name, email and message here e.g. email site admin with message details
        console.log({ name, email, message });
    
        return {
          status: 200,
        };
      } catch (err) {
        const error = `Error in /verify.json.js: ${err}\
    `;
        console.error(error);
        return {
          status: 500,
          error,
        };
      }
    }
    
    hCaptcha 요청은 JSON으로 응답하는 양식 데이터로 제출해야 합니다.응답의 successful 필드는 hCaptcha가 사용자를 로봇으로 간주하는지 여부를 표시합니다.자세한 내용은 hCaptcha 문서를 참조하십시오.

    ⛔️ SvelteKit hCaptcha 연락처: CORS 오류


    만약 웹 사이트를 테스트할 때 CORS 오류가 발생하면 DNS 설정을 조정해 보아야 합니다.이것은 127.0.0.1(localhost)의 호스트 이름 에이전트를 만드는 것과 관련이 있다.MacOS에서는 다음 행을 /private/etc/hosts 파일에 추가할 수 있습니다.
      127.0.0.1 test.localhost.com
    
    그리고 브라우저에서 http://localhost:3030을 사용하지 http://test.localhost.com:3030을 통해 사이트를 방문하지 않습니다.이것은 맥OS에서 나에게 매우 효과적이다.이것은 일반적인 Linux 및 Unix 시스템에도 적용되지만, 변경한 파일은 /etc/hosts입니다.DNSCryprt Proxy 또는 Unbound를 사용하는 경우 관련 구성 파일에서 이와 유사하게 변경할 수 있습니다.만약 당신이 윈도우즈를 사용하고 어떻게 조작하는지 알고 있다면, 다음에 다른 윈도우즈 사용자를 돕기 위해 평론을 발표하십시오.

    🙌🏽 SvelteKit hCaptcha 연락처: 우리가 무엇을 배웠는지


    우리는 방금 이곳에서 기본 지식을 소개했다.현실 세계의 응용 프로그램에서 최소한 서버에서 검증을 추가해야 한다.클라이언트의 피드백도 사용자 체험을 개선하는 좋은 생각이다.
    이 게시물에서 우리는 다음과 같은 것을 알게 되었다.
  • hCaptcha와 SvelteKit를 어떻게 결합시켜,
  • Rust Cloudflare workers를 정적 사이트에 통합하는 방법으로 서로 다른 프레임워크에 걸쳐 코드를 쉽게 공유할 수 있습니다.
  • hooks.js 파일을 통해 외부 호스트에 연결할 수 있도록 컨텐츠 보안 정책을 조정합니다.
  • 나는 정말 이 문장에서 적어도 한 가지는 네가 너의 일이나 보조 프로젝트에 쓸 수 있기를 바란다.여느 때와 마찬가지로 만약에 제가 어떤 기교를 놓쳤다면 피드백에 연락하세요!
    너는 full code for this SvelteKit hCaptcha Contact Form project on the Rodney Lab Git Hub repo을 볼 수 있다.

    🙏🏽 SvelteKit hCaptcha 연락처: 피드백


    너는 이 댓글이 유용하다고 생각하니?당신은 스스로 이 문제를 해결할 방법이 있습니까?너의 해결 방안을 나에게 알려줘.다른 주제의 댓글을 보고 싶으세요?새 게시물에 연락할 생각.그 밖에 만약에 제 작문 스타일을 좋아하신다면 저에게 연락을 주십시오. 만약에 제가 상담을 바탕으로 귀사 사이트를 위해 댓글을 쓸 수 있다면.계속 읽고 연락할 방법을 찾으세요. 자세한 것은 아래 문장을 보십시오.유사한 게시물을 지원하고 달러, 유로화, 파운드를 절약할 수 있다면 consider supporting me through Buy me a Coffee을 클릭하십시오.
    마지막으로, 당신의 소셜 미디어 계정에 이 글을 마음대로 공유해서, 당신의 모든 관심자들이 이 글을 매우 유용하게 생각하도록 하세요.아래에 댓글을 남기는 것 외에 트위터를 통해 askRodney on Telegram과 연락할 수 있다.further ways to get in touch with Rodney Lab도 참조하십시오.제가 항상 SvelteKit as well as other topics. Also subscribe to the newsletter to keep up-to-date with our latest projects.에 글을 올려요.

    좋은 웹페이지 즐겨찾기