Aracılığıyla paylaş


Öğretici: Yerel kimlik doğrulaması kullanarak iOS/macOS uygulamasında kaydolma ekleme

Şunlar için geçerlidir: Beyaz onay işareti simgesi olan yeşil daire. iOS (Swift) Beyaz onay işareti simgesi olan yeşil daire. macOS (Swift)

Bu öğreticide, tek seferlik geçiş kodu veya kullanıcı adı (e-posta) ve parola kullanarak bir kullanıcının nasıl kaydolduğunu gösterir ve yerel kimlik doğrulaması kullanarak iOS/macOS uygulamanızda kullanıcı özniteliklerini toplar.

  • Tek seferlik geçiş kodu veya kullanıcı adı (e-posta) ve parola kullanarak bir kullanıcıya kaydolun.
  • Kaydolma sırasında kullanıcı özniteliklerini toplayın.
  • Kaydolma hatalarını işleme.

Önkoşullar

Kullanıcı kaydolma

Tek seferlik geçiş kodunu veya kullanıcı adını (e-posta) ve parolayı kullanarak bir kullanıcıya kaydolmak için, kullanıcıdan bir e-posta toplar ve ardından kullanıcıya tek seferlik bir e-posta geçiş kodu içeren bir e-posta gönderirsiniz. Kullanıcı, kullanıcı adını doğrulamak için tek seferlik geçerli bir e-posta geçiş kodu girer.

Bir kullanıcıya kaydolmak için şunları yapmanız gerekir:

  1. Kullanıcı arabirimi (UI) oluşturma:

    • Kullanıcıdan bir e-posta toplayın. Kullanıcının geçerli bir e-posta adresi girdiğinden emin olmak için girişlerinize doğrulama ekleyin.
    • Kullanıcı adı (e-posta) ve parola ile kaydolarak bir parola toplayın.
    • Kullanıcıdan tek seferlik bir e-posta geçiş kodu toplayın.
    • Gerekirse kullanıcı özniteliklerini toplayın.
    • Kullanıcı bunu almazsa tek seferlik geçiş kodunu yeniden gönderin.
    • Kaydolma akışını başlatın.
  2. Uygulamanızda, seçme olayı aşağıdaki kod parçacığını tetikleyen bir düğme ekleyin:

    @IBAction func signUpPressed(_: Any) {
        guard let email = emailTextField.text else {
            resultTextView.text = "Email or password not set"
            return
        }
    
        nativeAuth.signUp(username: email, delegate: self)
    }
    
    • E-posta tek seferlik geçiş kodunu kullanarak bir kullanıcıya kaydolmak için, geçirilen temsilci nesnesinde protokolü uygulaması gereken yöntemlerden birini çağırarak zaman uyumsuz olarak yanıt veren kitaplığın signUp(username:delegate) SignUpStartDelegate yöntemini kullanırız. Aşağıdaki kod satırı, kullanıcı kayıt işlemini başlatır:

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

      yönteminde signUp(username:delegate) , kullanıcının e-posta adresini gönderim formundan ve temsilciden (protokolü uygulayan SignUpStartDelegate bir sınıf) geçiririz.

    • Parolayla e-posta kullanarak bir kullanıcıya kaydolmak için aşağıdaki kod parçacıklarını kullanın:

      @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)
      }
      

      geçirilen temsilci nesnesinde protokolü uygulaması gereken yöntemlerden birini çağırarak zaman uyumsuz olarak yanıt veren kitaplığın signUp(username:password:delegate) SignUpStartDelegate yöntemini kullanırız. Aşağıdaki kod satırı, kullanıcı kayıt işlemini başlatır:

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

      yönteminde signUp(username:password:delegate) kullanıcının e-posta adresini, parolasını ve temsilciyi (protokolü uygulayan SignUpStartDelegate bir sınıf) geçiririz.

    • Protokolü sınıfımızın uzantısı olarak uygulamak SignUpStartDelegate için şunu kullanın:

      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)"
          }
      }
      

      veya çağrısı signUp(username:password:delegate) signUp(username:delegate), ya onSignUpStartError() da onSignUpCodeRequired() temsilci yöntemlerine yönelik bir çağrıyla sonuç verir. onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength), kullanıcının e-posta adresini doğrulamak için bir kod gönderildiğini belirtmek için çağrılır. Kodun nereye gönderildiğine ve kaç basamak içerdiğine ilişkin bazı ayrıntıların yanı sıra, bu temsilci yönteminin türünde SignUpCodeRequiredStatebir newState parametresi de vardır ve bu da iki yeni yönteme erişmemizi sağlar:

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

      Kullanıcının bize sağladığı kodu göndermek için şunu kullanın:

      newState.submitCode(code: userSuppliedCode, delegate: self)
      
      • Protokolü sınıfımızın uzantısı olarak uygulamak SignUpVerifyCodeDelegate için şunu kullanın:

        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!"
            }
        }
        

        bir submitCode(code:delegate) temsilci parametresi kabul eder ve protokolde SignUpVerifyCodeDelegate gerekli yöntemleri uygulamamız gerekir. En yaygın senaryoda, kullanıcının kaydolduğunu ve akışın tamamlandığını belirten bir çağrısı onSignUpCompleted(newState) alırsınız.

Kaydolma sırasında kullanıcı özniteliklerini toplama

Bir kullanıcıyı tek seferlik geçiş kodu veya kullanıcı adı (e-posta) ve parola kullanarak kaydolsanız da, kullanıcının hesabı oluşturulmadan önce kullanıcı özniteliklerini toplayabilirsiniz. signUp(username:attributes:delegate) yöntemi, öznitelikleri parametre olarak kabul eder.

  1. Kullanıcı özniteliklerini toplamak için aşağıdaki kod parçacığını kullanın:

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

    signUp(username:attributes:delegate) veyaignUp(username:password:attributes:delegate), ya da onSignUpCodeRequired() onSignUpStartError() temsilci yöntemlerine yönelik bir çağrıyla ya da temsilcide uygulandıysa çağrısıyla onSignUpAttributesInvalid(attributeNames: [String]) sonuçlanır.

  2. Protokolü sınıfımızın uzantısı olarak uygulamak SignUpStartDelegate için aşağıdaki kod parçacığını kullanın:

    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)"
        }
    }
    

    Öznitelikler geçersizse yöntemi onSignUpAttributesInvalid(attributeNames: [String]) çağrılır. Bu durumda, kullanıcıya geçersiz özniteliklerin listesini görüntüleriz. Aksi takdirde, onSignUpCodeRequired(newState:sentTo:channelTargetType:codeLength) kullanıcının e-posta adresini doğrulamak için bir kod gönderildiğini belirtmek için çağrılır. Kodun alıcısı ve kodun basamak sayısı gibi ayrıntılar dışında, bu temsilci yönteminin türünde SignUpCodeRequiredStatebir newState parametresi vardır ve bu da iki yeni yönteme erişmemizi sağlar:

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

Bir veya daha fazla sayfada kullanıcı öznitelikleri

Öznitelikleri bir veya daha fazla sayfaya yaymak için, farklı sayfalarda toplamak istediğimiz öznitelikleri müşteri kimliği ve erişim yönetimi (CIAM) kiracı yapılandırmasında zorunlu olarak ayarlamamız gerekir.

Hiçbir öznitelik geçirmeden çağırırız signUp(username:password:delegate) . Sonraki adım, kullanıcının e-postasını doğrulamak için arama newState.submitCode(code: userSuppliedCode, delegate: self) yapmak olacaktır.

Protokolü daha önce olduğu gibi sınıfımızın bir uzantısı olarak uygularız SignUpVerifyCodeDelegate , ancak bu kez gerekli yöntemlere ek olarak isteğe bağlı yöntemi onSignUpAttributesRequired(attributes:newState) uygulamamız gerekir:

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!"
    }
}

Bu temsilci yöntemi, yeni bir yönteme erişmemizi sağlayan türünde SignUpAttributesRequiredStatebir newState parametresine sahiptir:

  • submitAttributes(attributes:delegate)

Kullanıcının bize sağladığı öznitelikleri göndermek için aşağıdaki kod parçacığını kullanın:

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

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

Ayrıca protokolü sınıfımızın bir uzantısı olarak uygulayacağız 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!"
    }
}

Kullanıcı tüm gerekli öznitelikleri sağlamadığında veya öznitelikler geçersizse, bu temsilci yöntemleri çağrılır:

  • onSignUpAttributesInvalid: gönderilen bir veya daha fazla özniteliğin giriş doğrulamasında başarısız olduğunu gösterir. Bu hata, geliştirici tarafından giriş doğrulaması başarısız olan tüm özniteliklerin listesi olan bir attributeNames parametresi içeriyor.
  • onSignUpAttributesRequired: kullanıcı hesabının oluşturulabilmesi için sunucunun bir veya daha fazla özniteliğin gönderilmesini gerektirdiğini belirtir. Kiracı yapılandırmasında bir veya daha fazla öznitelik zorunlu olarak ayarlandığında bu durum ortaya çıkar. Bu sonuç, API'nin MSALNativeAuthRequiredAttribute gerektirdiği kullanıcı öznitelikleriyle ilgili ayrıntıları özetleyen nesnelerin listesi olan attributes parametresini içerir.

Her iki temsilci yöntemi de yeni bir durum başvurusu içerir. Parametresini newState yeni özniteliklerle yeniden çağırmak submitAttributes(attributes:delegate) için kullanırız.

Kaydolma hatalarını işleme

Kaydolma sırasında her eylem başarılı olmaz. Örneğin, kullanıcı zaten kullanımda olan bir e-posta adresiyle kaydolmaya çalışabilir veya geçersiz bir kod gönderebilir.

Önceki protokol uygulamamızda SignUpStartDelegate , temsilci işlevini işlediğimizde onSignUpStartError(error) hatayı görüntüledik.

Belirli bir hata türünü yöneterek kullanıcı deneyimini geliştirmek için aşağıdaki kod parçacığını kullanın:

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")"
    }
}

İsteğe bağlı: Kayıt akışı sonrasında oturum açma

Başarılı bir kayıt akışı sonrasında, oturum açma akışı başlatmadan bir kullanıcıyla oturum açabilirsiniz. Öğretici: iOS/macOS uygulamasına kaydoldıktan sonra kullanıcıyı otomatik olarak oturum açma makalesinde daha fazla bilgi edinin.

Sonraki adım