HomeOur Team
Sign In with Apple - iOS
Solutions
Sign In with Apple - iOS
October 29, 2020
3 min

Sign In with Apple

Sign In with Apple là gì?

“Sign In with Apple” là một công cụ xác thực được Apple ra mắt cùng với iOS 13. Giống như Login with Google, Sign In with Apple giúp lập trình viên và người dùng truy cập ứng dụng một cách đơn giản, dễ dàng và bảo mật.

Tại sao phải sử dụng?

Kể từ khi ra mắt, Apple đã yêu cầu các lập trình viên bổ sung Sign In with Apple là một tính năng bắt buộc nếu họ muốn sử dụng Login in with Google và Facebook. Nếu không, ứng dụng của bạn sẽ bị từ chối và không thể vượt qua quy trình đánh giá ứng dụng của Apple.

Làm thế nào để tích hợp Sign In with Apple?

Service ID và Key Configuration:

Bạn cần sử dụng Certificates, Identifiers & Profiles để thiết lập identifiers và keys cho tài khoản Apple Developer trước khi tích hợp Sign In with Apple. Các tổ chức có thể đăng ký tối đa 100 URL website cho mỗi Service ID để sử dụng Sign in with Apple, trong khi đó cá nhân chỉ có thể đăng ký tối đa 10 URL website.

Chi tiết xem tại đây.

Thêm Sign In with Apple Capability:

Truy cập file project Xcode > Signing & Capabilities và thêm “Sign In with Apple”. Chú ý hãy sử dụng tài khoản deverloper bạn đã config ở trên.

Thêm button Sign In with Apple:

Đầu tiên hãy import framework “AuthenticationServices”. Đây là một framework được thêm vào từ SDK cho iOS 12 để quản lý mật khẩu được lưu trong keychain và nay nó còn chịu trách nghiệm xử lý tính năng Sign In with Apple nữa.

import AuthenticationServices

Để thêm một button vô cùng đơn giản, sử dụng ngay class ASAuthorizationAppleIDButton có sẵn trong framework. Chú ý ASAuthorizationAppleIDButton được kế thừa từ UIControl chứ không phải UIButton. Thêm target và action cho button vừa tạo.

let button = ASAuthorizationAppleIDButton()
button.addTarget(self, action: #selector(appleIDButtonTapped), for: .touchUpInside)

Bạn có thể tự tạo ra nút Sign In with Apple, tuy nhiên hãy tuân thủ thiết kế tại đây.

Dialog Sign In with Apple:

Response khi tap vào button gồm 7 bước:

  1. Khởi tạo một instance ASAuthorizationAppleIDProvider để chịu trách nhiệm tạo ra request cho phương thức xác thực dựa trên AppleID.
  2. Khởi tạo request bằng cách gọi hàm createRequest() từ provider.
  3. Định nghĩa trường mà bạn muốn nhận từ user bao gồm Email và Họ tên.
  4. Khởi tạo ASAuthorizationController từ request.
  5. Set delegate để tương tác với hành động của người dùng trên dialog.
  6. Set presentationContextProvider để controller có thể cho biết window nào cần mở dialog.
  7. Gọi hàm performRequests.
@objc func appleIDButtonTapped() {
    let request = ASAuthorizationAppleIDProvider().createRequest()
    request.requestedScopes = [.fullName, .email]
    
    let controller = ASAutthorizationController(authorizationRequests: [request])
    controller.delegate = self
    controller.presentationContextProvider = self
    controller.performRequests()
}

Sau khi hoàn thành 7 bước trên, một dialog sẽ hiển thị lên màn hình, nhưng với một số lưu ý bạn cần biết:

  1. Người dùng có thể chỉnh sửa tên trước khi chia sẻ với ứng dụng.
  2. Nếu người dùng có nhiều email liên kết với tài khoản, họ có thể chọn một trong số đó.
  3. Người dùng có thể chọn ẩn email thật và Apple sẽ tự tạo ra một email ngẫu nhiên, độc nhất. Email mà Apple tạo cho người dùng mỗi lần đăng nhập/đăng ký cho một ứng dụng/dịch vụ là giống nhau và không thể sử dụng cho ứng dụng/dịch vụ khác.
  4. Không yêu cầu người dùng cung cấp thông tin như số điện thoại… nếu không thực sự cần thiết trong luồng đăng ký của ứng dụng.

Dialog khi đăng nhập bằng tài khoản Apple

Xử lý Response trả về:

HàmdidCompleteWithAuthorization:

Bên cạnh controller, hàm này còn có parameter authorization thuộc kiểu ASAuthorization. Đây là một object chưa tất cả dữ liệu được yêu cầu từ quá trình xác thực.

func authorizationController(controller: ASAuthorizationController, điCompleteWithAuthorization authorization: ASAuthorization) {
    if let credential = authorization.credential as? ASAuthorizationAppleIDCredential {
        if let email = credential.email {
            signWithEmail(email: email)
        }
        let userID = credential.user
        saveUserID(id: userID)
    }
}

Có gì dữ liệu gì trong credential?

  • Dữ liệu cơ bản gồm Họ Tên và Email.
  • Các dữ liệu khác như user id …

Xử lý các thay đổi trạng thái trong Apple ID:

Như chúng ta đã biết, người dùng hoàn toàn có thể đăng xuất khỏi tài khoản Apple ID hoặc ngừng cung cấp quyền sử dụng tài khoản đó. Vì vậy, chúng ta sẽ có một sự kiện dành riêng cho điều đó: NSNotification.Name.ASAuthorizationAppleIDProviderCredentialRevoked

Tất cả những gì bạn cần là lắng nghe sự kiện này và lấy thông tin trạng thái với user ID tương ứng thông qua ASAuthorizationAppleIDProvider:

NotificationCenter.default.addObserver(self, selector: #selector(appleIDStateChanged), name: NSNotification.Name.ASAuthorizationAppleIDProviderCredentialRevoked, object: nil)

@objc func appleIDStateChanged() {
    let provider = ASAuthorizationAppleIDProvider()
    provider.getCredentialState(forUserID: "123") { (credentialState, error) in
        switch(credentialState) {
        case .authorized:
            self.keepOnWithYourLife()
        case .revoked:
            self.logout()
        case .notFound:
            self.logout()
        default: break
        }
    }
}

Tài khoản đã tồn tại:

Nếu người dùng đăng nhập bằng email và passworrd trước và password đó đã được lưu trong keychain thì nó sẽ gợi ý người dùng đăng nhập bằng cách sử dụng email address và password sẵn có.

Bên cạnh xử lý response, hãy kiểm tra authorization.credential trong hàm delegatedidCompleteWithAuthorization, bạn sẽ biết được người dùng đăng nhập bằng một email và password đã được lưu.

func performExistingAccountSetupFlow() {
    let requests = [ASAuthorizationAppleIDProvider().createRequest(),
                                    ASAuthorizationPasswordProvider().createRequest()]
    let authorizationController = ASAuthorizationController(authorizationReuquests: requests)
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self
    authorizationController.performRequests()
}
func authorizationController(controller _: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    switch authorization.credential {
    case let credential as ASAuthorizationAppleIDCredential:
        if let email = credential.email {
            signWithEmail(email:email)
        }
    case let credential as ASPasswordCredential:
        let user = credential.user
        signWithUserID(userID: user)
    default: break
    }
}

Đọc thêm: Sign In with Apple in Backend (Java)

Nguồn: medium


Tags

#signinwithapple#authen#ios#102020

Related Posts

Sign In with Apple - Backend (Java)
Sign In with Apple - Backend (Java)
hoang.le
October 29, 2020
3 min
© 2021, All Rights Reserved.

Quick Links

HomeOur Team

Social Media