Amazon Cognito Node SDK 시작

15319 단어 nodeawstutorial
Amazon Cognito는 AWS에서 제공하는 인증 서비스입니다.일반적으로 AWS Amplify와 함께 애플리케이션 인증을 위해 사용되며, 이를 위해 Amazon은 많은 문서를 제공합니다.
그러나 Cognito SDK를 직접 사용하는 자원은 더욱 희소하다.이 문서는 다양한 스택 넘침 답안, AWS 문서 기사, 그리고 이 서비스를 이용하여 기능 검증 시스템에 필요한 순수한 시도와 오류를 절약할 수 있기를 바랍니다.
본고는 나체 Express 응용 프로그램에 사용되는 Github repo를 포함하고 Cognito 방법을 보여 준다."이 강좌의 목적으로"한 줄은 내가 이 프로그램을 위해 사용자 풀을 만들 때 취한 절차를 나타낸다.

Cognito 설정

  • AWS 콘솔의 Cognito 서비스로 이동

  • 사용자 풀 관리 를 클릭한 다음 사용자 풀 생성 을 클릭합니다.

    사용자 풀 생성



  • 풀 이름을 입력하고 [단계적 설정] 을 클릭합니다.

    속성




  • 사용자가 로그인할 수 있는 방법을 선택하십시오.
  • 이 강좌에서 나는 전자메일만 사용할 것이다

  • 각 사용자가 원하는 필수 속성 선택

    정책



  • 암호 선택 요구 사항

  • 사용자가 직접 등록할 수 있는지 또는 관리자가 사용자를 등록해야 하는지 선택하십시오.

    MFA 및 검증



  • 다중 요소 인증 사용 여부 선택
    -MFA는 이 강좌의 범위를 넘어서는 복잡성을 증가시켰다.그러나 이것은 미래 문장의 주제일 수도 있다.

  • 사용자가 계정을 복구할 수 있는 방법을 선택하십시오.
  • 이 강좌에서 저는 "이메일만"
  • 을 사용합니다.

    메시지 사용자 정의




  • 메시지 사용자 정의: 사용자가 응용 프로그램을 등록할 때 보내는 전자 메일을 사용자 정의할 수 있습니다.
  • AWS SE를 설정하지 않고 Cognito를 사용하여 이메일을 보내는 경우 하루에 최대 50통의 이메일만 보낼 수 있습니다.이것은 생산과 사용에 있어서는 아직 좋지 않지만, 개인/보조 프로젝트에 있어서는 당신의 수요에 적합해야 합니다

  • e-메일 인증 - 코드 및 링크
  • 링크 기반 인증: 사용자에게 전자 메일 링크를 보내고 링크를 클릭하여 로그인을 확인합니다.
  • 코드 기반 인증: 전자메일을 통해 사용자에게 코드를 보내고 응용 프로그램은 "confirmSignUp"방법으로 코드를 검증하여 사용자의 로그인을 검증합니다.
  • 태그



  • 필요한 리소스 레이블 추가

    설비



  • 사용자 장치를 기억할지 여부를 선택하십시오. 이것은 MFA와 관련이 있습니다.
  • MFA를 사용하지 않는 한 "시종"을 클릭하지 마십시오!이렇게 하면 일부 Cognito 메서드에 필요한 매개변수가 변경됩니다.
  • 애플리케이션 클라이언트



  • 응용 프로그램 클라이언트 추가 - 이름 및 영패 새로 고침 값 입력
  • 클라이언트 암호 생성 확인

  • Auth Flows에서 "ALLOW\u ADMIN\u USER\u PASSWORD\u Auth"를 선택합니다.

    트리거



  • 어떤 트리거에 필요한 람다 함수를 분배합니다.

    되돌아보다



  • 이전 단계에서 언급한 모든 필드를 작성했는지 확인하십시오
  • 풀을 만든 후에 변경할 수 없는 속성을 주의하세요!
  • 만들기
  • 를 클릭합니다.

    응용 프로그램에서 Cognito 사용


    필요한 NPM 패키지

  • aws-sdk
  • jwk-to-pem
  • jsonwebtoken
  • 환경 변수

  • AWS\u SECRET\u ACCESS\u 키: AWS 계정의 보안 자격 증명 페이지에서 이 키를 가져오거나IAM User 비밀 해시를 만들 수 있습니다
  • AWS\u ACCESS\u KEY\u ID: AWS 계정의 보안 자격 증명 페이지에서 이 정보를 얻거나IAM User 액세스 키를 사용하여 생성할 수 있습니다
  • AWS_ 영역: 사용자 풀이 있는 영역(예: us-east-1).
  • AWS\u CLIENT\u ID: Cognito 콘솔에서 이 정보를 얻습니다.일반 설정에서 찾을 수 있습니다.→ 애플리케이션 클라이언트 또는 애플리케이션 통합→ 응용 프로그램 클라이언트 설정.
  • AWS\u COGNITO\u SECRET\u HASH: COGNITO 콘솔에서 이것을 가져옵니다.일반 설정에서 찾을 수 있습니다.→ 응용 프로그램 클라이언트.응용 프로그램 클라이언트에서 세부 정보 표시 버튼을 클릭하여 필드를 표시합니다.
  • AWS\u USER\u POOL\u ID: Cognito 콘솔에서 가져옵니다.일반 설정에서 찾을 수 있습니다.
  • SERVER_NAME: Cognito 서버에 입력한 이름입니다.
  • 중요한 보조 함수


    //  Authentication flows require the value returned by this function
    
    import {createHmac} from 'crypto';
    const {AWS_COGNITO_SECRET_HASH, AWS_CLIENT_ID} from './environment';
    
    function createSecretHash(username){
        return createHmac('sha256', AWS_COGNITO_SECRET_HASH)
                .update(username + AWS_CLIENT_ID).digest('base64');
    }
    
    // Authentication flows require request headers to be formatted as an
    // array of objects with the shape {headerName: string, headerValue: string}
    
    // this tutorial assumes you're using express and formats the headers 
    // according to that assumption
    
    function formatHeaders(headers){
        let formattedHeaders = [ ];
        for(const headerName in headers){
            formattedHeaders.push({
                headerName, 
                headerValue:headers[headerName]
            });
        }
        return formattedHeaders;
    }
    

    JWT 서명 확인

  • jwks를 만듭니다.응용 프로그램 루트 디렉터리의 json 파일
  • 파일 내용은 다음과 같은 구조를 가진 URL에서 추출해야 한다.https://cognito-idp.{YOUR_AWS_REGION}.amazonaws.com/{YOUR_AWS_USER_POOL_ID}/.well-known/jwks.json
  • 또는 응용 프로그램에서 위의 URL에 GET 요청을 보내고 요청 결과
  • 를 사용할 수 있습니다.
  • JWT 서명을 검증해야 할 때마다 다음 함수를 사용하십시오
  • const jsonwebtoken = require('jsonwebtoken');
    const jwkToPem = require('jwkToPem');
    const jwks = require('./jwks.json');
    
    function verifyTokenSignature(token){
        // alternatively you can use jsonwebtoken.decode() 
        const tokenHeader = JSON.parse(
            Buffer.from(token.split('.')[0],  'base64').toString()
        );
        const properJwk = jwks.find(jwk => jwk.kid === tokenHeader.kid);
        const pem = jwkToPem(properJwk);
        return new Promise((resolve, reject) => {
            jsonwebtoken.verify(
                token, 
                pem, 
                {algorithms: ['RS256']}, 
                (err, decodedToken) => {
                    err ? reject(false): resolve(true);
                }
            )
        });
    }
    
    주의해야 할 중요한 것은 JWT 서명을 검증한 후에도 몇 가지 절차를 취해야 한다는 것이다 herehere.

    예제 용법


    const cognito = new CognitoIdentityServiceProvider({
        secretAccessKey:'YOUR_SECRET_ACCESS_KEY',
        accessKeyId:'YOUR_ACCESS_KEY_ID',
        region:'YOUR_COGNITO_POOL_REGION'
    });
    
    function register(Username, Password){
        const params = {
            ClientId: 'YOUR_AWS_CLIENT_ID',
            Username,
            Password,
            SecretHash: createSecretHash(username)
        }
        return cognito.signUp(params).promise()
    }
    

    주의사항


    register 방법을 호출하고 사용자 이름을 지정한 사용자가 존재할 때, Cognito는 "주어진 전자 우편을 가진 계정이 이미 존재합니다"라고 메시지를 되돌려줍니다.이것은 나쁜 사람이 당신의 응용 프로그램에 대해 사용자 매거 조작을 실행할 수 있게 한다(read more.가능한 해결 방안은 오류를 처리할 때 이 특정 메시지를 검사하고 오류가 아닌 기본 등록 성공 메시지를 되돌려주는 것이다.
    admin Initiate Auth 방법으로 영패 흐름을 새로 고칠 때, 사용자가 영패 (랜덤 문자열처럼 보이는 것) 의 사용자 이름 필드에 접근하는 것을 사용합니다.그렇지 않으면 기밀 검증 해시 실패 메시지가 표시됩니다.

    결론


    풀 설정과 기본적인 조수 함수가 완성되면 Cognito를 사용하면 매우 간단해진다. 정확한 매개 변수를 필요한 함수에 전달하기만 하면 된다.Cognito 설정으로 서버가 종료되지 않도록 보호합니다.또 많은 다른 중요한 절차를 채택해야 한다.OWASP 메모장은 어플리케이션 보호에 대한 더 많은 정보를 얻을 수 있는 좋은 장소입니다.

    참조 링크


  • AWS SDK documentation for Cognito
  • Cognito Sampler Repository
  • 한층 더 읽다

  • OWASP Cheat Sheet on NodeJS Security
  • OWASP Cheat Sheet on Authentication
  • 좋은 웹페이지 즐겨찾기