다음.Next Auth 및 AWS Cognito를 사용하여 js 인증

27666 단어
지난 댓글Custom Authentication UI for Amplify and Next.js website with React Hook Form, Next.js, Tailwind CSS 이후로 계속 해보고 싶어요NextAuth.js
먼저 AWS Amplify Auth 클래스의 모든 사용법을 삭제했습니다.나는 본래 사용자 정의 사용자 인터페이스를 만들려고 하였으나, 지금 보니, 너는Nextuth를 사용할 때만 위탁 관리 사용자 인터페이스를 사용할 수 있을 것 같다.js (맞춤형 공급자가 아니라면 https://next-auth.js.org/providers/credentials#example-ui.이것은 응용 프로그램/사이트의 삽입식 신분 검증이어야 하기 때문에 매우 의미가 있다.하지만 제가 틀렸다면 바로잡아 주세요.

아마존


인증 흐름에는 Amazon Cognito 사용자 풀이 필요합니다.설정하지 않은 경우 다음 단계에 따라 하나를 추가합니다.
  • 로그인http://console.aws.amazon.com/ 및 사용자 풀 관리 클릭
  • 사용자 풀 만들기를 클릭하면 오른쪽 상단에 사용자 풀이 설정되어 있기 때문입니다.
  • 풀 이름을 입력하고 Review Defaults(기본값 보기)를 선택합니다. - 원하는 대로 선택하십시오. 그러나 이 경우 기본값을 변경하기만 하면 됩니다.
  • 중요 알림: 응용 프로그램 클라이언트 추가 선택 - 클라이언트를 인증 서비스에 연결하는 데 필요한 상세한 정보를 포함합니다

    애플리케이션 클라이언트 추가
  • 를 클릭합니다.
  • 애플리케이션 클라이언트 이름을 입력하고 클라이언트 암호 생성 을 선택합니다.
  • 풀로 돌아가기 세부 정보 선택
  • 풀 생성 을 클릭합니다.

  • 이제 왼쪽 메뉴에서 도메인 이름을 선택하려면 도메인을 설정해야 합니다.
  • 도메인 이름 입력 -
  • 가용성 확인
  • 나중에 필요한 도메인 이름 저장
  • 변경 사항 저장
  • 을 클릭합니다.


  • 거의 다 왔다😓, 응용 프로그램 클라이언트 설정 선택
  • Cognito 사용자 풀 확인
  • 로컬 개발을 위한 리셋 URL 추가http://localhost:3000/api/auth/callback/cognito
  • 인증번호 승인 확인
  • 및 다음에 허용되는 oAuth 범위: 전자메일, Openid 및 프로필
  • 및 변경 사항 저장

  • 이것이 바로 모든 필요한 설정이며, 마지막 단계는 관련된 것을 얻는 것이다.NextAuth에 필요한 환경 변수입니다.js.왼쪽 메뉴에 있는 프로그램 클라이언트로 돌아가서 프로그램 클라이언트 id를 기록합니다. "자세한 정보 보이기"를 선택하고 프로그램 클라이언트에게 비밀을 지키십시오.

    다음.js


    이제 재미있는 부분을 보도록 하겠습니다.Nextuth를 기존 또는 새 프로젝트에 설치합니다.js 의존 관계:
    yarn add next-auth
    // or
    npm install next-auth
    

    에반 선생


    js를 추가하기 전에 환경 변수를 설정합니다.프로젝트의 루트 디렉터리에 .env.local 파일 추가하기
    COGNITO_CLIENT_ID=*App client id*
    COGNITO_CLIENT_SECRET=*App client secret*
    COGNITO_DOMAIN=*Domain name*
    
    이전에 설정한 id, 기밀, 영역으로 바꾸기
    자세한 내용은 Cognito>Manage user pools에 로그인하여 확인할 수 있습니다.

    API 라우팅


    documentation[...nextauth].js라는 파일을 추가합니다.
    import NextAuth from 'next-auth'
    import Providers from 'next-auth/providers'
    
    export default NextAuth({
      providers: [
        Providers.Cognito({
          clientId: process.env.COGNITO_CLIENT_ID,
          clientSecret: process.env.COGNITO_CLIENT_SECRET,
          domain: process.env.COGNITO_DOMAIN,
        })
      ],
      debug: process.env.NODE_ENV === 'development' ? true : false
    })
    
    우리는Nextuth에 많은 공급업체를 제공했고, 나는cognito의 상세한 정보를 추가했다.debug for 개발자 모드를 추가하면 터미널에서 다양한 로그를 사용할 수 있습니다.문제가 있으면 로그인한 사용자의 키 값이 맞는지 확인하면 이 기능이 매우 유용합니다.
    현재 pages/api/auth 의 모든 요청은 로그인, 로그아웃 등 Nextuth에서 처리됩니다.

    다음 갈고리 사용.


    내부api/auth/*에서 모든 코드를 다음 코드로 교체합니다.
    import Head from 'next/head'
    import Link from 'next/link'
    import { signIn, signOut, useSession } from 'next-auth/client'
    
    export default function Home() {
      const [session, loading] = useSession()
    
      return (
        <div>
          <Head>
            <title>Authentication with NextAuth and AWS Cognito</title>
            <link rel="icon" href="/favicon.ico" />
          </Head>
          <main>
            <div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
              <div className="max-w-md w-full space-y-8 flex items-center flex-col">
                <a>
                  <div className="flex-shrink-0 flex items-center bg-orange-500 h-20 w-20 border-radius p-2 font-bold text-4xl">
                    dlw
                  </div>
                </a>
    
                {!session &&
                  <>
                    <h2 className="mt-6 text-center text-3xl font-extrabold text-gray-900">
                      Example NextAuth Sign In
                    </h2>
                    <button
                      type="submit"
                      className="inline-flex items-center justify-center w-1/2 mt-12 rounded-md border border-transparent px-5 py-3 bg-gray-900 text-base font-medium text-white shadow hover:bg-black focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-rose-500 sm:px-10 disabled:opacity-50 disabled:cursor-not-allowed"
                      disabled={loading}
                      onClick={() => signIn('cognito', {
                        callbackUrl: `${window.location.origin}/protected`
                      })}
                    >
                      Sign In
                    </button>
                  </>
                }
    
                {session &&
                  <>
                    <h1 className="my-6 text-center text-3xl font-extrabold text-gray-900">
                      Welcome, {session.user.name ?? session.user.email}
                    </h1>
                    <nav>
                      <Link href="/protected">
                        <a className="text-orange-500 hover:bg-black hover:text-white">Protected Page</a>
                      </Link>
                    </nav>
                    <button
                      type="submit"
                      className="inline-flex items-center justify-center w-1/2 mt-12 rounded-md border border-transparent px-5 py-3 bg-gray-900 text-base font-medium text-white shadow hover:bg-black focus:outline-none focus:ring-2 focus:ring-white focus:ring-offset-2 focus:ring-offset-rose-500 sm:px-10 disabled:opacity-50 disabled:cursor-not-allowed"
                      disabled={loading}
                      onClick={() => signOut({
                        callbackUrl: `${window.location.origin}`
                      })}
                    >
                      Sign Out
                    </button>
                  </>
                }
    
              </div>
            </div>
          </main>
        </div>
      )
    }
    
    useSession 갈고리는 로그인 상태를 검사하는 가장 간단한 방법입니다.사용자가 로그인하지 않은 경우 처리 프로그램 클릭과 함께 로그인 버튼이 표시됩니다.
    onClick={() => signIn('cognito', {
      callbackUrl: `${window.location.origin}/client-protected`
    })}
    
    첫 번째 인자로 코그니트를 추가했습니다. 로그인 단추를 눌렀을 때 코그니토 트랜잭션 UI를 표시할 수 있도록 합니다.보호된 페이지로 callbackUrl 리디렉션
    이 때 우리는 등록이나 로그인을 테스트할 수 있다.개발 서버pages/index.js를 실행하고 http://localhost:3000/로 이동합니다.로그인을 선택하면 기존 계정으로 로그인하거나 새 계정을 등록할 수 있습니다.

    세션 공급자


    다중 페이지 프로그램에서 세션 공급자를 추가해야 합니다.이렇게 하면 세션 상태가 페이지 간에 공유될 수 있습니다.

    which improves performance, reduces network traffic and avoids component state changes while rendering -


    업데이트yarn run dev:
    import { Provider } from 'next-auth/client'
    import "tailwindcss/tailwind.css";
    
    function MyApp({ Component, pageProps }) {
      return (
        <Provider session={pageProps.session}>
          <Component {...pageProps} />
        </Provider>
      )
    }
    
    export default MyApp
    
    Provider 가져오기pages/_app.js를 추가하고 Provider 구성 요소에서 기본 애플리케이션 구성 요소를 패키지화합니다.
        <Provider session={pageProps.session}>
          <Component {...pageProps} />
        </Provider>
    
    로그인하면

    보호 페이지


    보호된 페이지의 경우/pages 디렉토리에 import { Provider } from 'next-auth/client'라는 새 페이지를 추가합니다(실제 페이지 이름은 중요하지 않음).
    import Head from 'next/head'
    import Link from 'next/link'
    import { getSession } from 'next-auth/client'
    
    function Protected() {
    
      return (
        <div>
          <Head>
            <title>Authentication with NextAuth and AWS Cognito</title>
            <link rel="icon" href="/favicon.ico" />
          </Head>
          <main>
            <div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8">
              <div className="max-w-md w-full space-y-8  flex items-center flex-col">
                <a>
                  <div className="flex-shrink-0 flex items-center bg-orange-500 h-20 w-20 border-radius p-2 font-bold text-4xl">
                    dlw
                  </div>
                </a>
                <h1 className="my-6 text-center text-3xl font-extrabold text-gray-900">Client Protected</h1>
                <nav>
                  <Link href="/">
                    <a className="text-orange-500 hover:bg-black hover:text-white">Home</a>
                  </Link>
                </nav>
                <div className="prose">
                  <p>Faucibus commodo massa rhoncus, volutpat. <strong>Dignissim</strong> sed <strong>eget risus enim</strong>. Mattis mauris semper sed amet vitae sed turpis id. Id dolor praesent donec est. Odio penatibus risus viverra tellus varius sit neque erat velit. Faucibus commodo massa rhoncus, volutpat. Dignissim sed eget risus enim. <a href="#">Mattis mauris semper</a> sed amet vitae sed turpis id.</p>
                </div>
              </div>
            </div>
          </main>
        </div>
      )
    }
    
    export default Protected
    
    export async function getServerSideProps(context) {
      const { res } = context;
      const session = await getSession(context)
    
      if (!session) {
        res.writeHead(302, {
          Location: "/",
        });
        return res.end();
      }
    
      return {
        props: { session }
      }
    }
    
    중요한 부분은 getServerSideProps에서 session 사용할 수 있는지 확인하고, 사용할 수 없으면 로그인 단추를 사용하여 색인 페이지로 다시 지정합니다.
    저장소: https://github.com/dwhiteGUK/dlw-next-auth-cognito

    프로덕션에 배포


    생산 환경에 배치하기 전에 우리는 환경 변수에 하나를 추가해야 한다protected.js.또한 이전 환경 변수를 생산 환경에 추가해야 한다
    나는 Vercel에서 다음 경기의 대부분 시간을 주재했다.js 사이트는 프로젝트 설정에 추가됩니다.

    좋은 웹페이지 즐겨찾기