Nếu đã nâng cấp lên Xác thực Firebase với Nền tảng nhận dạng, thì bạn có thể xác thực người dùng của mình với Firebase bằng cách sử dụng nhà cung cấp tuân thủ OpenID Connect (OIDC) mà bạn chọn. Điều này cho phép sử dụng các nhà cung cấp danh tính không được Firebase hỗ trợ.
Trước khi bắt đầu
Để đăng nhập người dùng bằng nhà cung cấp OIDC, trước tiên bạn phải thu thập một số thông tin từ nhà cung cấp:
Client ID : Một chuỗi duy nhất cho nhà cung cấp xác định ứng dụng của bạn. Nhà cung cấp của bạn có thể chỉ định cho bạn một ID khách hàng khác cho từng nền tảng mà bạn hỗ trợ. Đây là một trong những giá trị của yêu cầu
aud
bằng mã thông báo ID do nhà cung cấp của bạn cấp.Bí mật ứng dụng khách : Một chuỗi bí mật mà nhà cung cấp sử dụng để xác nhận quyền sở hữu ID ứng dụng khách. Đối với mỗi ID khách hàng, bạn sẽ cần một bí mật khách hàng phù hợp. (Giá trị này chỉ bắt buộc nếu bạn đang sử dụng luồng mã xác thực , điều này rất được khuyến khích.)
Tổ chức phát hành : Một chuỗi xác định nhà cung cấp của bạn. Giá trị này phải là một URL, khi được nối với
/.well-known/openid-configuration
, là vị trí của tài liệu khám phá OIDC của nhà cung cấp. Ví dụ: nếu tổ chức phát hành làhttps://auth.example.com
, tài liệu khám phá phải có tạihttps://auth.example.com/.well-known/openid-configuration
.
Sau khi bạn có thông tin trên, hãy bật OpenID Connect làm nhà cung cấp dịch vụ đăng nhập cho dự án Firebase của bạn:
Nếu bạn chưa nâng cấp lên Xác thực Firebase với Nền tảng nhận dạng, hãy làm như vậy. Xác thực OpenID Connect chỉ khả dụng trong các dự án được nâng cấp.
Trên trang Nhà cung cấp dịch vụ đăng nhập của bảng điều khiển Firebase, nhấp vào Thêm nhà cung cấp mới rồi nhấp vào Kết nối OpenID .
Chọn xem bạn sẽ sử dụng luồng mã ủy quyền hay luồng cấp phép ẩn .
Bạn nên luôn sử dụng dòng mã nếu nhà cung cấp của bạn hỗ trợ . Luồng ẩn kém an toàn hơn và việc sử dụng nó không được khuyến khích.
Đặt tên cho nhà cung cấp này. Lưu ý ID nhà cung cấp được tạo: đại loại như
oidc.example-provider
. Bạn sẽ cần ID này khi thêm mã đăng nhập vào ứng dụng của mình.Chỉ định ID khách hàng và bí mật khách hàng của bạn và chuỗi công ty phát hành của nhà cung cấp của bạn. Các giá trị này phải khớp chính xác với các giá trị mà nhà cung cấp của bạn đã chỉ định cho bạn.
Lưu các thay đổi của bạn.
Xử lý luồng đăng nhập bằng SDK Firebase
Cách dễ nhất để xác thực người dùng của bạn bằng Firebase bằng cách sử dụng nhà cung cấp OIDC của bạn là xử lý toàn bộ quy trình đăng nhập bằng SDK Firebase.
Để xử lý quy trình đăng nhập bằng SDK nền tảng Apple của Firebase, hãy làm theo các bước sau:
Thêm lược đồ URL tùy chỉnh vào dự án Xcode của bạn:
- Mở cấu hình dự án của bạn: nhấp đúp vào tên dự án ở chế độ xem dạng cây bên trái. Chọn ứng dụng của bạn từ phần MỤC TIÊU , sau đó chọn tab Thông tin và mở rộng phần Loại URL .
- Nhấp vào nút + và thêm ID ứng dụng đã mã hóa của bạn làm lược đồ URL. Bạn có thể tìm ID ứng dụng đã mã hóa của mình trên trang Cài đặt chung của bảng điều khiển Firebase, trong phần dành cho ứng dụng iOS của bạn. Để trống các trường khác.
Khi hoàn tất, cấu hình của bạn sẽ trông giống như sau (nhưng với các giá trị dành riêng cho ứng dụng của bạn):
Tạo một phiên bản của
OAuthProvider
bằng cách sử dụng ID nhà cung cấp mà bạn có trong bảng điều khiển Firebase.Nhanh
var provider = OAuthProvider(providerID: "oidc.example-provider")
Mục tiêu-C
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];
Tùy chọn : Chỉ định các tham số OAuth tùy chỉnh bổ sung mà bạn muốn gửi cùng với yêu cầu OAuth.
Nhanh
provider.customParameters = [ "login_hint": "user@example.com" ]
Mục tiêu-C
[provider setCustomParameters:@{@"login_hint": @"user@example.com"}];
Kiểm tra với nhà cung cấp của bạn để biết các thông số mà nó hỗ trợ. Lưu ý rằng bạn không thể chuyển các tham số bắt buộc của Firebase với
setCustomParameters
. Các tham số này làclient_id
,response_type
,redirect_uri
,state
,scope
vàresponse_mode
.Tùy chọn : Chỉ định các phạm vi OAuth 2.0 bổ sung ngoài cấu hình cơ bản mà bạn muốn yêu cầu từ nhà cung cấp xác thực.
Nhanh
provider.scopes = ["mail.read", "calendars.read"]
Mục tiêu-C
[provider setScopes:@[@"mail.read", @"calendars.read"]];
Kiểm tra với nhà cung cấp của bạn để biết phạm vi mà nó hỗ trợ.
Tùy chọn : Nếu bạn muốn tùy chỉnh cách ứng dụng của mình trình bày
SFSafariViewController
hoặcUIWebView
khi hiển thị reCAPTCHA cho người dùng, hãy tạo một lớp tùy chỉnh tuân theo giao thứcAuthUIDelegate
.Xác thực với Firebase bằng đối tượng nhà cung cấp OAuth.
Nhanh
// If you created a custom class that conforms to AuthUIDelegate, // pass it instead of nil: provider.getCredentialWith(nil) { credential, error in if error != nil { // Handle error. } if credential != nil { Auth().signIn(with: credential) { authResult, error in if error != nil { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken } } }
Mục tiêu-C
// If you created a custom class that conforms to AuthUIDelegate, // pass it instead of nil: [provider getCredentialWithUIDelegate:nil completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) { if (error) { // Handle error. } if (credential) { [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { if (error) { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }]; } }];
Mặc dù các ví dụ trên tập trung vào các luồng đăng nhập, nhưng bạn cũng có khả năng liên kết nhà cung cấp OIDC với người dùng hiện có bằng cách sử dụng
linkWithCredential
. Ví dụ: bạn có thể liên kết nhiều nhà cung cấp với cùng một người dùng để cho phép họ đăng nhập bằng một trong hai nhà cung cấp.Nhanh
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // OIDC credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken }
Mục tiêu-C
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // OIDC credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }];
Mẫu tương tự có thể được sử dụng với
reauthenticateWithCredential
có thể được sử dụng để truy xuất thông tin đăng nhập mới cho các hoạt động nhạy cảm yêu cầu đăng nhập gần đây.Nhanh
Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken }
Mục tiêu-C
[[FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }];
Xử lý quy trình đăng nhập theo cách thủ công
Nếu bạn đã triển khai luồng đăng nhập OpenID Connect trong ứng dụng của mình, thì bạn có thể sử dụng trực tiếp mã thông báo ID để xác thực với Firebase:
Nhanh
let credential = OAuthProvider.credential(
withProviderID: "oidc.example-provider", // As registered in Firebase console.
idToken: idToken, // ID token from OpenID Connect flow.
rawNonce: nil
)
Auth.auth().signIn(with: credential) { authResult, error in
if error {
// Handle error.
return
}
// User is signed in.
// IdP data available in authResult?.additionalUserInfo?.profile
}
Mục tiêu-C
FIROAuthCredential *credential =
[FIROAuthProvider credentialWithProviderID:@"oidc.example-provider" // As registered in Firebase console.
IDToken:idToken // ID token from OpenID Connect flow.
rawNonce:nil];
[[FIRAuth auth] signInWithCredential:credential
completion:^(FIRAuthDataResult * _Nullable authResult,
NSError * _Nullable error) {
if (error != nil) {
// Handle error.
return;
}
// User is signed in.
// IdP data available in authResult.additionalUserInfo.profile
}];
Bước tiếp theo
Sau khi người dùng đăng nhập lần đầu tiên, tài khoản người dùng mới được tạo và liên kết với thông tin đăng nhập—nghĩa là tên người dùng và mật khẩu, số điện thoại hoặc thông tin nhà cung cấp xác thực—người dùng đã đăng nhập bằng. Tài khoản mới này được lưu trữ như một phần của dự án Firebase của bạn và có thể được sử dụng để xác định người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.
Trong các ứng dụng của mình, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ đối tượng
User
. Xem Quản lý người dùng .Trong Cơ sở dữ liệu thời gian thực Firebase và Quy tắc bảo mật bộ lưu trữ đám mây , bạn có thể lấy ID người dùng duy nhất của người dùng đã đăng nhập từ biến
auth
và sử dụng biến đó để kiểm soát dữ liệu mà người dùng có thể truy cập.
Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của mình bằng nhiều nhà cung cấp xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp xác thực với tài khoản người dùng hiện có.
Để đăng xuất người dùng, hãy gọi signOut:
.
Nhanh
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Mục tiêu-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Bạn cũng có thể muốn thêm mã xử lý lỗi cho toàn bộ các lỗi xác thực. Xem Xử lý lỗi .