Nếu hỗ trợ đăng nhập bằng Tài khoản Google, bạn có thể sử dụng ứng dụng đăng nhập bằng một lần chạm để mang đến cho người dùng trải nghiệm tạo tài khoản suôn sẻ mà không bao giờ đưa họ ra khỏi bối cảnh của ứng dụng.
Khi bạn hiển thị giao diện người dùng Một lần chạm, người dùng sẽ được nhắc tạo một tài khoản mới với ứng dụng của bạn bằng một trong các Tài khoản Google trên thiết bị của họ. Nếu người dùng chọn tiếp tục, bạn sẽ nhận được mã thông báo ID có thông tin cơ bản về hồ sơ—tên, ảnh hồ sơ và địa chỉ email đã xác minh của họ. Bạn có thể sử dụng những thông tin này để tạo tài khoản mới.
Quy trình tạo tài khoản bằng một lần chạm gồm hai phần:
- Tích hợp ứng dụng Một lần chạm vào ứng dụng của bạn như mô tả trên trang này. Việc này gần giống như tính năng Đăng nhập bằng một lần chạm, nhưng có một số điểm khác biệt về cấu hình.
- Thêm vào phần phụ trợ của bạn khả năng tạo tài khoản người dùng từ mã thông báo mã nhận dạng của Google. Điều này được thảo luận trong bài viết Sử dụng mã thông báo mã nhận dạng trên phần phụ trợ.
Tôi nên dùng tính năng đăng ký bằng một lần chạm ở đâu?
Vị trí có tác động mạnh mẽ nhất để cung cấp tính năng đăng ký bằng một lần chạm cho người dùng là trong bối cảnh mà việc đăng nhập sẽ bật các tính năng mới. Trước tiên, hãy thử đăng nhập người dùng bằng thông tin xác thực đã lưu. Nếu không tìm thấy thông tin xác thực đã lưu, hãy đề nghị tạo một tài khoản mới cho người dùng.
Trước khi bắt đầu
Thiết lập dự án trên bảng điều khiển API của Google và dự án Android như mô tả trong bài viết Bắt đầu với tính năng đăng nhập bằng một lần chạm.
1. Định cấu hình ứng dụng Một lần chạm
Để định cấu hình ứng dụng Một lần chạm nhằm tạo tài khoản, hãy làm như sau:
- Không bật yêu cầu thông tin xác thực mật khẩu. (Chỉ có thể đăng ký bằng một lần nhấn khi xác thực dựa trên mã thông báo.)
Bật yêu cầu mã thông báo giá trị nhận dạng của Google bằng cách sử dụng
setGoogleIdTokenRequestOptions()
và các chế độ cài đặt sau:- Đặt mã ứng dụng khách của máy chủ thành mã nhận dạng bạn đã tạo trong bảng điều khiển API của Google. Xin lưu ý đây là mã ứng dụng khách của máy chủ chứ không phải mã ứng dụng khách Android của bạn.
- Định cấu hình ứng dụng để hiển thị mọi Tài khoản Google trên thiết bị – nghĩa là không lọc theo tài khoản được uỷ quyền.
- Nếu muốn, bạn cũng có thể yêu cầu số điện thoại đã xác minh cho tài khoản.
Java
public class YourActivity extends AppCompatActivity { // ... private SignInClient oneTapClient; private BeginSignInRequest signUpRequest; @Override public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { super.onCreate(savedInstanceState, persistentState); oneTapClient = Identity.getSignInClient(this); signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build(); // ... } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private lateinit var oneTapClient: SignInClient private lateinit var signUpRequest: BeginSignInRequest override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) oneTapClient = Identity.getSignInClient(this) signUpRequest = BeginSignInRequest.builder() .setGoogleIdTokenRequestOptions( BeginSignInRequest.GoogleIdTokenRequestOptions.builder() .setSupported(true) // Your server's client ID, not your Android client ID. .setServerClientId(getString(R.string.your_web_client_id)) // Show all accounts on the device. .setFilterByAuthorizedAccounts(false) .build()) .build() // ... } // ... }
2. Theo dõi việc huỷ giao diện người dùng bằng một lần chạm
Bạn nên theo dõi xem liệu người dùng đã từ chối sử dụng tính năng Đăng ký bằng một lần chạm hay chưa bằng cách đóng lời nhắc hoặc nhấn vào bên ngoài lời nhắc. Việc này có thể đơn giản như thuộc tính boolean của Hoạt động. (Hãy xem phần Dừng hiển thị giao diện người dùng bằng một lần chạm ở bên dưới.)
3. Hiển thị giao diện người dùng đăng ký bằng một lần chạm
Nếu người dùng chưa từ chối sử dụng tính năng Một lần chạm để tạo tài khoản mới, hãy gọi phương thức beginSignIn()
của đối tượng ứng dụng và đính kèm trình nghe vào Task
mà phương thức này trả về. Các ứng dụng thường thực hiện bước này khi yêu cầu đăng nhập bằng một lần chạm không tìm thấy thông tin xác thực đã lưu nào – tức là trong trình nghe lỗi của yêu cầu đăng nhập.
Ứng dụng Một lần chạm sẽ gọi trình nghe thành công nếu người dùng đã thiết lập một hoặc nhiều Tài khoản Google trên thiết bị. Trong trình nghe thành công, hãy lấy ý định đang chờ xử lý từ kết quả Task
rồi truyền ý định đó đến startIntentSenderForResult()
để khởi động Giao diện người dùng bằng một lần chạm.
Nếu người dùng không có Tài khoản Google nào trên thiết bị, ứng dụng Một lần chạm sẽ gọi trình nghe lỗi. Trong trường hợp này, bạn không cần làm gì cả: bạn chỉ cần tiếp tục cho thấy trải nghiệm khi đã đăng xuất của ứng dụng là người dùng có thể đăng ký theo quy trình tạo tài khoản thông thường.
Java
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
@Override
public void onSuccess(BeginSignInResult result) {
try {
startIntentSenderForResult(
result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
}
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.getLocalizedMessage());
}
});
Kotlin
oneTapClient.beginSignIn(signUpRequest)
.addOnSuccessListener(this) { result ->
try {
startIntentSenderForResult(
result.pendingIntent.intentSender, REQ_ONE_TAP,
null, 0, 0, 0)
} catch (e: IntentSender.SendIntentException) {
Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
}
}
.addOnFailureListener(this) { e ->
// No Google Accounts found. Just continue presenting the signed-out UI.
Log.d(TAG, e.localizedMessage)
}
4. Xử lý phản hồi của người dùng
Phản hồi của người dùng về lời nhắc đăng ký bằng một lần chạm sẽ được báo cáo cho ứng dụng của bạn bằng phương thức onActivityResult()
của Hoạt động. Nếu người dùng chọn tạo tài khoản, kết quả sẽ là một mã thông báo giá trị nhận dạng của Google. Nếu người dùng từ chối đăng ký, bằng cách đóng giao diện người dùng Một lần chạm hoặc nhấn vào bên ngoài giao diện, thì kết quả sẽ trả về với mã RESULT_CANCELED
. Ứng dụng của bạn cần xử lý cả hai khả năng.
Tạo tài khoản bằng mã thông báo giá trị nhận dạng của Google
Nếu người dùng đã chọn đăng ký bằng Tài khoản Google, bạn có thể nhận mã thông báo mã nhận dạng cho người dùng bằng cách truyền dữ liệu ý định từ onActivityResult()
sang phương thức getSignInCredentialFromIntent()
của ứng dụng Một lần chạm. Thông tin đăng nhập này sẽ có thuộc tính googleIdToken
không rỗng.
Sử dụng mã thông báo mã nhận dạng để tạo một tài khoản trên phần phụ trợ của bạn (xem bài viết Xác thực bằng hệ thống phụ trợ bằng mã thông báo mã nhận dạng) rồi đăng nhập người dùng.
Thông tin đăng nhập cũng chứa mọi thông tin chi tiết bổ sung mà bạn yêu cầu, chẳng hạn như số điện thoại đã xác minh của tài khoản (nếu có).
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data); String idToken = credential.getGoogleIdToken(); if (idToken != null) { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token."); } } catch (ApiException e) { // ... } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { val credential = oneTapClient.getSignInCredentialFromIntent(data) val idToken = credential.googleIdToken when { idToken != null -> { // Got an ID token from Google. Use it to authenticate // with your backend. Log.d(TAG, "Got ID token.") } else -> { // Shouldn't happen. Log.d(TAG, "No ID token!") } } } catch (e: ApiException) { // ... } } } // ... }
Dừng hiển thị giao diện người dùng bằng một lần chạm
Nếu người dùng từ chối đăng nhập, thì lệnh gọi đến getSignInCredentialFromIntent()
sẽ gửi một ApiException
chứa mã trạng thái CommonStatusCodes.CANCELED
.
Khi điều này xảy ra, bạn nên tạm thời dừng hiển thị giao diện người dùng đăng nhập bằng một lần chạm để không làm phiền người dùng bằng những lời nhắc lặp lại. Ví dụ sau giúp bạn hoàn thành việc này bằng cách thiết lập một thuộc tính trên Hoạt động. Thuộc tính này sẽ sử dụng thuộc tính này để xác định xem có nên cung cấp cho người dùng tính năng đăng nhập bằng một lần chạm hay không; tuy nhiên, bạn cũng có thể lưu một giá trị vào SharedPreferences
hoặc sử dụng một số phương thức khác.
Bạn cần phải triển khai giới hạn số lượng yêu cầu đăng nhập bằng một lần chạm của riêng bạn. Nếu bạn không thực hiện việc này và người dùng huỷ nhiều lời nhắc liên tiếp, thì ứng dụng Một lần chạm sẽ không nhắc người dùng trong 24 giờ tiếp theo.
Java
public class YourActivity extends AppCompatActivity { // ... private static final int REQ_ONE_TAP = 2; // Can be any integer unique to the Activity. private boolean showOneTapUI = true; // ... @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case REQ_ONE_TAP: try { // ... } catch (ApiException e) { switch (e.getStatusCode()) { case CommonStatusCodes.CANCELED: Log.d(TAG, "One-tap dialog was closed."); // Don't re-prompt the user. showOneTapUI = false; break; case CommonStatusCodes.NETWORK_ERROR: Log.d(TAG, "One-tap encountered a network error."); // Try again or just ignore. break; default: Log.d(TAG, "Couldn't get credential from result." + e.getLocalizedMessage()); break; } } break; } } }
Kotlin
class YourActivity : AppCompatActivity() { // ... private val REQ_ONE_TAP = 2 // Can be any integer unique to the Activity private var showOneTapUI = true // ... override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) when (requestCode) { REQ_ONE_TAP -> { try { // ... } catch (e: ApiException) { when (e.statusCode) { CommonStatusCodes.CANCELED -> { Log.d(TAG, "One-tap dialog was closed.") // Don't re-prompt the user. showOneTapUI = false } CommonStatusCodes.NETWORK_ERROR -> { Log.d(TAG, "One-tap encountered a network error.") // Try again or just ignore. } else -> { Log.d(TAG, "Couldn't get credential from result." + " (${e.localizedMessage})") } } } } } } // ... }
Các bước tiếp theo
Khi người dùng hoàn tất quy trình đăng ký bằng một lần chạm, bạn sẽ nhận được mã thông báo của Google. Mã này bao gồm một số thông tin hồ sơ cơ bản: địa chỉ email, họ tên và URL ảnh hồ sơ của người dùng. Đối với nhiều ứng dụng, thông tin này là đủ để bạn xác thực người dùng trên phần phụ trợ và tạo một tài khoản mới.
Nếu bạn cần thêm thông tin để hoàn tất quá trình tạo tài khoản (ví dụ: ngày sinh của người dùng), hãy hiển thị cho người dùng một quy trình chi tiết đăng ký, nơi bạn yêu cầu thông tin bổ sung này. Sau đó, gửi thông tin này đến phần phụ trợ của bạn để hoàn tất quá trình tạo tài khoản.