다음을 통해 공유


자습서: 네이티브 인증을 사용하여 iOS 모바일 앱에서 등록 추가

이 자습서에서는 전자 메일 일회용 암호 또는 사용자 이름(이메일) 및 암호를 사용하여 사용자를 등록하고 네이티브 인증을 사용하여 iOS 모바일 앱에서 사용자 특성을 수집하는 방법을 보여 줍니다.

  • 이메일 일회용 암호 또는 사용자 이름(이메일)과 암호를 사용하여 사용자를 등록합니다.
  • 가입 시 사용자 특성을 수집합니다.
  • 등록 오류를 처리합니다.

필수 조건

사용자 등록

이메일 일회용 암호 또는 사용자 이름(이메일) 및 암호를 사용하여 사용자를 등록하려면 사용자로부터 이메일을 수집한 다음 이메일 일회용 암호가 포함된 이메일을 사용자에게 보냅니다. 사용자는 사용자 이름의 유효성을 검사하기 위해 유효한 이메일 일회용 암호를 입력합니다.

사용자를 등록하려면 다음이 필요합니다.

  1. 다음을 위한 UI(사용자 인터페이스)를 만듭니다.

    • 사용자로부터 메일을 수집합니다. 입력에 유효성 검사를 추가하여 사용자가 유효한 전자 메일 주소를 입력하는지 확인합니다.
    • 사용자 이름(이메일)과 암호로 등록하는 경우 암호를 수집합니다.
    • 사용자로부터 이메일 일회용 암호를 수집합니다.
    • 필요한 경우 사용자 특성을 수집합니다.
    • 사용자가 수신하지 않는 경우 일회용 암호를 다시 보냅니다.
    • 등록 절차를 시작합니다.
  2. 앱에서 선택 이벤트가 다음 코드 조각을 트리거하는 단추를 추가합니다.

    @IBAction func signUpPressed(_: Any) {
        guard let email = emailTextField.text else {
            resultTextView.text = "Email or password not set"
            return
        }
    
        nativeAuth.signUp(username: email, delegate: self)
    }
    
    • 이메일 일회용 암호를 사용하여 사용자를 등록하려면 프로토콜을 구현해야 하는 전달된 대리자 개체의 signUp(username:delegate) 메서드 중 하나를 호출하여 비동기적으로 응답하는 라이브러리의 메서드를 SignUpStartDelegate 사용합니다. 다음 코드 줄은 사용자 등록 프로세스를 시작합니다.

      nativeAuth.signUp(username: email, delegate: self)
      

      signUp(username:delegate) 메서드에서는 제출 양식과 대리자(프로토콜을 구현하는 클래스)에서 사용자의 이메일 주소를 전달합니다 SignUpStartDelegate .

    • 암호로 전자 메일을 사용하여 사용자를 등록하려면 다음 코드 조각을 사용합니다.

      @IBAction func signUpPressed(_: Any) {
          guard let email = emailTextField.text, let password = passwordTextField.text else {
              resultTextView.text = "Email or password not set"
              return
          }
      
          nativeAuth.signUp(username: email,password: password,delegate: self)
      }
      

      프로토콜을 구현해야 하는 전달된 대리자 개체의 signUp(username:password:delegate) 메서드 중 하나를 호출하여 비동기적으로 응답하는 라이브러리의 메서드를 SignUpStartDelegate 사용합니다. 다음 코드 줄은 사용자 등록 프로세스를 시작합니다.

      nativeAuth.signUp(username: email, password: password, delegate: self)
      

      signUp(username:password:delegate) 이 메서드에서는 사용자의 이메일 주소, 해당 암호 및 대리자(프로토콜을 구현하는 클래스)를 전달합니다SignUpStartDelegate.

    • SignUpStartDelegate 프로토콜을 클래스의 확장으로 구현하려면 다음을 사용합니다.

      extension ViewController: SignUpStartDelegate {
          func onSignUpStartError(error: MSAL.SignUpStartError) {
              resultTextView.text = "Error signing up: \(error.errorDescription ?? "no description")"
          }
      
          func onSignUpCodeRequired(
              newState: MSAL.SignUpCodeRequiredState,
              sentTo: String,
              channelTargetType: MSAL.MSALNativeAuthChannelType,
              codeLength: Int
          ) {
              resultTextView.text = "Verification code sent to \(sentTo)"
          }
      }
      

      메서드를 signUp(username:password:delegate) 호출하거나 signUp(username:delegate) 메서드를 위임합니다 onSignUpCodeRequired()onSignUpStartError() . 사용자의 메일 주소를 확인하기 위해 코드가 전송되었음을 나타내기 위해 onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength)가 호출됩니다. 코드가 전송된 위치 및 코드에 포함된 자릿수에 대한 세부 정보와 함께 이 대리자 메서드에는 SignUpCodeRequiredState 형식의 newState 매개 변수도 있으며 이를 통해 두 가지 새로운 메서드에 액세스할 수 있습니다.

      • submitCode(code:delegate)
      • resendCode(delegate)

      사용자가 제공한 코드를 제출하려면 다음을 사용합니다.

      newState.submitCode(code: userSuppliedCode, delegate: self)
      
      • SignUpVerifyCodeDelegate 프로토콜을 클래스의 확장으로 구현하려면 다음을 사용합니다.

        extension ViewController: SignUpVerifyCodeDelegate {
            func onSignUpVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignUpCodeRequiredState?) {
                resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")"
            }
        
            func onSignUpCompleted(newState: SignInAfterSignUpState) {
                resultTextView.text = "Signed up successfully!"
            }
        }
        

        submitCode(code:delegate)는 대리자 매개 변수를 허용하며 SignUpVerifyCodeDelegate 프로토콜에 필수 메서드를 구현해야 합니다. 가장 일반적인 시나리오에서는 사용자가 등록되었고 흐름이 완료되었음을 나타내는 호출 onSignUpCompleted(newState) 을 받습니다.

가입 시 사용자 특성 수집

전자 메일 일회용 암호 또는 사용자 이름(이메일) 및 암호를 사용하여 사용자를 등록하든 사용자의 계정을 만들기 전에 사용자 특성을 수집할 수 있습니다. 메서드는 signUp(username:attributes:delegate) 특성을 매개 변수로 허용합니다.

  1. 사용자 특성을 수집하려면 다음 코드 조각을 사용합니다.

    let attributes = [
        "country": "United States",
        "city": "Redmond"
    ]
    
    nativeAuth.signUp(username: email, attributes: attributes, delegate: self)
    

    signUp(username:attributes:delegate) 또는 ignUp(username:password:attributes:delegate) 대리자 메서드 또는 대리자 onSignUpStartError()onSignUpCodeRequired() 메서드에 대한 호출 또는 대리자에서 구현된 경우 호출 onSignUpAttributesInvalid(attributeNames: [String]) 이 발생합니다.

  2. SignUpStartDelegate 프로토콜을 클래스의 확장으로 구현하려면 다음 코드 조각을 사용합니다.

    extension ViewController: SignUpStartDelegate {
        func onSignUpStartError(error: MSAL.SignUpStartError) {
            resultTextView.text = "Error signing up: \(error.errorDescription ?? "no description")"
        }
    
        func onSignUpCodeRequired(
            newState: MSAL.SignUpCodeRequiredState,
            sentTo: String,
            channelTargetType: MSAL.MSALNativeAuthChannelType,
            codeLength: Int
        ) {
            resultTextView.text = "Verification code sent to \(sentTo)"
        }
    
        func onSignUpAttributesInvalid(attributeNames: [String]) {
           resultTextView.text = "Invalid attributes  \(attributeNames)"
        }
    }
    

    특성이 잘못된 경우 onSignUpAttributesInvalid(attributeNames: [String]) 메서드가 호출됩니다. 이 경우 사용자에게 잘못된 특성 목록이 표시됩니다. 그렇지 않으면 사용자의 메일 주소를 확인하기 위해 코드가 전송되었음을 나타내기 위해 onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength)가 호출됩니다. 이 대리자 메서드는 코드의 받는 사람 및 코드의 숫자 수와 같은 세부 정보 외에도 두 가지 새 메서드에 대한 액세스 권한을 제공하는 형식SignUpCodeRequiredState의 매개 변수를 가지고 newState 있습니다.

    • submitCode(code:delegate)
    • resendCode(delegate)

하나 이상의 페이지에 사용자 특성 분산

특성을 하나 이상의 페이지에 분산하려면 여러 페이지에서 수집하려는 특성을 CIAM(고객 ID 및 액세스 관리) 테넌트 구성에서 필수로 설정해야 합니다.

특성을 전달하지 않고 signUp(username:password:delegate)을 호출합니다. 다음 단계는 newState.submitCode(code: userSuppliedCode, delegate: self)를 호출하여 사용자의 메일을 확인하는 것입니다.

SignUpVerifyCodeDelegate 프로토콜을 이전과 같이 클래스의 확장으로 구현하지만, 이번에는 필요한 메서드 외에도 선택적 onSignUpAttributesRequired(attributes:newState) 메서드를 구현해야 합니다.

extension ViewController: SignUpVerifyCodeDelegate {
    func onSignUpAttributesRequired(newState: SignUpAttributesRequiredState) {
        resultTextView.text = "Attributes required"
    }

    func onSignUpVerifyCodeError(error: MSAL.VerifyCodeError, newState: MSAL.SignUpCodeRequiredState?) {
        resultTextView.text = "Error verifying code: \(error.errorDescription ?? "no description")"
    }

    func onSignUpCompleted(newState: SignInAfterSignUpState) {
        resultTextView.text = "Signed up successfully!"
    }
}

이 대리자 메서드에는 SignUpAttributesRequiredState 형식의 newState 매개 변수가 있으므로 새 메서드에 액세스할 수 있습니다.

  • submitAttributes(attributes:delegate)

사용자가 제공한 특성을 제출하려면 다음 코드 조각을 사용합니다.

let attributes = [
    "country": "United States",
    "city": "Redmond"
]

newState.submitAttributes(attributes: attributes, delegate: self)

또한 SignUpAttributesRequiredDelegate 프로토콜을 클래스의 확장으로 구현합니다.

extension ViewController: SignUpAttributesRequiredDelegate {
    func onSignUpAttributesRequiredError(error: AttributesRequiredError) {
        resultTextView.text = "Error submitting attributes: \(error.errorDescription ?? "no description")"
    }

    func onSignUpAttributesRequired(attributes: [MSALNativeAuthRequiredAttribute], newState: SignUpAttributesRequiredState) {
        resultTextView.text = "Attributes required"
    }

    func onSignUpAttributesInvalid(attributeNames: [String], newState: SignUpAttributesRequiredState) {
        resultTextView.text = "Attributes invalid"
    }

    func onSignUpCompleted(newState: SignInAfterSignUpState) {
        resultTextView.text = "Signed up successfully!"
    }
}

사용자가 필요한 특성을 모두 제공하지 않거나 특성이 잘못된 경우 다음 대리자 메서드가 호출됩니다.

  • onSignUpAttributesInvalid: 전송된 하나 이상의 특성이 입력 유효성 검사에 실패했음을 나타냅니다. 이 오류에는 개발자가 보낸 입력 유효성 검사에 실패한 모든 특성 목록인 attributeNames 매개 변수가 포함됩니다.
  • onSignUpAttributesRequired: 사용자 계정을 만들기 전에 서버에서 하나 이상의 특성을 전송해야 임을 나타냅니다. 이는 테넌트 구성에서 하나 이상의 특성이 필수로 설정된 경우에 발생합니다. 이 결과에는 API에 필요한 사용자 특성에 대한 세부 정보를 간략하게 설명하는 MSALNativeAuthRequiredAttribute 개체 목록인 특성 매개 변수가 포함됩니다.

두 대리자 메서드 모두 새 상태 참조를 포함합니다. 매개 변수를 newState 사용하여 새 특성을 사용하여 다시 호출 submitAttributes(attributes:delegate) 합니다.

등록 오류 처리

가입하는 동안 모든 작업이 성공하는 것은 아닙니다. 예를 들어 사용자가 이미 사용 중인 메일 주소로 가입하려 하거나 잘못된 코드를 제출할 수 있습니다.

이전 SignUpStartDelegate 프로토콜 구현에서는 onSignUpStartError(error) 대리자 함수를 처리할 때 오류를 표시했습니다.

특정 오류 유형을 관리하여 사용자 환경을 개선하려면 다음 코드 조각을 사용합니다.

func onSignUpStartError(error: MSAL.SignUpStartError) {
    if error.isUserAlreadyExists {
        resultTextView.text = "Unable to sign up: User already exists"
    } else if error.isInvalidPassword {
        resultTextView.text = "Unable to sign up: The password is invalid"
    } else if error.isInvalidUsername {
        resultTextView.text = "Unable to sign up: The username is invalid"
    } else {
        resultTextView.text = "Unexpected error signing up: \(error.errorDescription ?? "no description")"
    }
}

선택 사항: 등록 절차 후 로그인

등록 흐름이 성공적으로 완료되면 로그인 흐름을 시작하지 않고도 사용자가 로그인할 수 있습니다. 자습서: iOS 앱 문서에서 등록한 후 자동으로 사용자 로그인에 대해 자세히 알아보세요.

다음 단계

자습서: 네이티브 인증을 사용하여 iOS 앱에서 로그인 및 로그아웃을 추가합니다.