眾所周知,一般想要開(kāi)發(fā)一個(gè)社交應(yīng)用需要客戶端服務(wù)器等很多模塊配合才能夠?qū)崿F(xiàn)。尤其是登錄系統(tǒng),想要構(gòu)建一個(gè)安全高效的登錄需要大量的開(kāi)發(fā)維護(hù)工作。今天就教大家如何不需要搭建任何服務(wù)器就可以完成一個(gè)簡(jiǎn)單的社交應(yīng)用登錄系統(tǒng)開(kāi)發(fā)。
我們的登錄認(rèn)證系統(tǒng)使用的是華為AppGallery Connect認(rèn)證服務(wù),首先簡(jiǎn)單介紹一下AppGallery Connect,AppGallery Connect(簡(jiǎn)稱AGC),致力于為開(kāi)發(fā)者提供應(yīng)用創(chuàng)意、開(kāi)發(fā)、分發(fā)、運(yùn)營(yíng)、分析全生命周期服務(wù),構(gòu)建全場(chǎng)景智慧化的應(yīng)用生態(tài)。目前,AGConnect已經(jīng)開(kāi)通了87項(xiàng)服務(wù)。
華為AGC認(rèn)證服務(wù)就提供了一套完整的手機(jī)號(hào)和郵箱地址注冊(cè)登錄系統(tǒng)。
首先,對(duì)于新的用戶,認(rèn)證服務(wù)提供了賬號(hào)的注冊(cè)系統(tǒng)。首先看下我們的應(yīng)用注冊(cè)界面:
手機(jī)號(hào)注冊(cè)與郵箱注冊(cè)的具體流程大致相同,以手機(jī)號(hào)碼注冊(cè)流程為例:
認(rèn)證服務(wù)SDK提供了內(nèi)置的驗(yàn)證碼發(fā)送功能,應(yīng)用不需要自己去找通訊供應(yīng)商開(kāi)通發(fā)送驗(yàn)證碼的服務(wù),非常方便。郵箱認(rèn)證也提供了發(fā)送郵箱驗(yàn)證碼的功能,只需要調(diào)用AGConnectAuth.requestVerifyCode傳入用戶信息就可以請(qǐng)求驗(yàn)證碼。代碼示例如下:
String countryCode = "86";
VerifyCodeSettings settings = VerifyCodeSettings.newBuilder()
.action(VerifyCodeSettings.ACTION_REGISTER_LOGIN)
.sendInterval(30) //shortest send interval ,30-120s
.locale(Locale.SIMPLIFIED_CHINESE) //optional,must contain country and language eg:zh_CN
.build();
if (notEmptyString(countryCode) && notEmptyString(accountNumber)) {
Task<VerifyCodeResult> task = PhoneAuthProvider.requestVerifyCode(countryCode, accountNumber, settings);
task.addOnSuccessListener(TaskExecutors.uiThread(), verifyCodeResult ->
Toast.makeText(RegisterActivity.this, "verify code has been sent.", Toast.LENGTH_SHORT).show()
).addOnFailureListener(TaskExecutors.uiThread(), e -> {
Toast.makeText(RegisterActivity.this, "Failed. "+e.getMessage(), Toast.LENGTH_SHORT).show();
Log.e(TAG, "requestVerifyCode fail:" + e.getMessage());
});
} else {
AGConnectCrash.getInstance().testIt(RegisterActivity.this);
}
在我們的注冊(cè)頁(yè)面中,也可以看到一個(gè)輸入密碼的輸入框,這里SDK又提供了一個(gè)很便捷的功能。認(rèn)證服務(wù)給用戶提供了驗(yàn)證碼和密碼兩種登錄方式。用戶在注冊(cè)的時(shí)候可以選擇是否給自己的賬號(hào)設(shè)置一個(gè)密碼,如果密碼這里選擇了設(shè)置,那后續(xù)登錄的時(shí)候就可以使用密碼的方式來(lái)登錄,如果沒(méi)有在注冊(cè)時(shí)設(shè)置,則可以通過(guò)驗(yàn)證碼的方式來(lái)登錄。注冊(cè)成功后,SDK會(huì)自動(dòng)幫用戶進(jìn)行登錄,無(wú)需再跳轉(zhuǎn)回登錄界面重新登錄。我們開(kāi)發(fā)的社交登錄系統(tǒng)注冊(cè)的時(shí)候設(shè)置了密碼,相關(guān)示例代碼如下:
PhoneUser phoneUser = new PhoneUser.Builder()
.setCountryCode(countryCode)
.setPhoneNumber(accountNumber)
.setVerifyCode(verifyCode)
.setPassword(password)
.build();
AGConnectAuth.getInstance().createUser(phoneUser).addOnSuccessListener(signInResult -> {
String phoneNumber = signInResult.getUser().getPhone();
String uid = signInResult.getUser().getUid();
Bundle data = new Bundle();
data.putString("phone", phoneNumber);
data.putString("uid", uid);
Intent intent = new Intent(RegisterActivity.this, ImageListActivity.class);
intent.putExtras(data);
startActivity(intent);
finish();
}).addOnFailureListener(e -> {
Log.e(TAG, "register error, " + e);
ToastUtils.showToast(RegisterActivity.this, "Register failed. "+e.getMessage());
});
對(duì)于已經(jīng)注冊(cè)的用戶,我們同樣提供了使用手機(jī)號(hào)或郵箱登錄的能力。下面我們的登錄界面:
由于我們的應(yīng)用只設(shè)置了使用密碼登錄,所以在剛剛的注冊(cè)環(huán)節(jié)也必須是輸入密碼。代碼中,只需要調(diào)用signin接口將用戶相應(yīng)的數(shù)據(jù)傳入就可以進(jìn)行登錄了。登錄代碼示例如下:
String countryCode = "86";
AGConnectAuthCredential credential = PhoneAuthProvider.credentialWithVerifyCode(
countryCode,
phoneAccount,
photoPassword,
null ); // password, can be null
AGConnectAuth.getInstance().signIn(credential).addOnSuccessListener(signInResult -> {
String phoneNumber = signInResult.getUser().getPhone();
String uid = signInResult.getUser().getUid();
Bundle data = new Bundle();
data.putString("account", this.getString(R.string.phone_user)+phoneNumber.substring(11, 15));
data.putString("uid", uid);
ToastUtils.showToast(LoginActivity.this, "Login Success");
Intent intent = new Intent(LoginActivity.this, ImageListActivity.class);
intent.putExtras(data);
startActivity(intent);
finish();
}).addOnFailureListener(e -> {
Log.e(TAG, "Login failed: " + e.getMessage());
ToastUtils.showToast(LoginActivity.this, "Account Error,Confirm and try again");
});
登錄成功后認(rèn)證服務(wù)會(huì)返回一個(gè)當(dāng)前用戶的唯一ID,開(kāi)發(fā)者可以根據(jù)這個(gè)ID來(lái)區(qū)分不同的用戶。可以看到我們的登錄界面還有一個(gè)匿名登錄的選項(xiàng)。這個(gè)也是認(rèn)證服務(wù)提供的。認(rèn)證服務(wù)提供了用戶的匿名模式,用戶可以不注冊(cè)不登錄,通過(guò)匿名的方式來(lái)體驗(yàn)應(yīng)用的功能,通俗點(diǎn)說(shuō)就是游客模式,這樣可以給用戶一個(gè)試用的機(jī)會(huì),提高應(yīng)用轉(zhuǎn)化率,有興趣的可以參考文檔實(shí)現(xiàn)。
登錄成功后,我們來(lái)到了圖片展示頁(yè)面:
這個(gè)頁(yè)面分為兩個(gè)部分,第一部分為標(biāo)題部分,分為用戶的名稱以及三個(gè)操作的按鈕,分別為添加圖片,刷新與退出登錄。用戶的名稱是通過(guò)認(rèn)證服務(wù)登錄成功以后的返回信息里獲取的。退出登錄則用到了認(rèn)證服務(wù)的退出登錄功能,退出后界面會(huì)就返回到之前的登錄界面,退出登錄的功能實(shí)現(xiàn)就不贅述了,調(diào)用signout接口即可。
而頁(yè)面下半部分的圖片展示則使用到了AGC的云存儲(chǔ)云數(shù)據(jù)庫(kù)等功能,這些功能也是基于認(rèn)證服務(wù)來(lái)實(shí)現(xiàn)的。認(rèn)證服務(wù)可以為云存儲(chǔ)與云數(shù)據(jù)庫(kù)提供憑證,例如云數(shù)據(jù)庫(kù)服務(wù)需要認(rèn)證服務(wù)的權(quán)限認(rèn)證才可以進(jìn)行增刪改等操作。具體這些服務(wù)是怎么應(yīng)用到我們的App中的,我將在以后的文章中為大家介紹。
總結(jié):
使用華為AGC認(rèn)證服務(wù)免除了自己搭建服務(wù)器進(jìn)行登錄認(rèn)證的煩惱,僅通過(guò)集成認(rèn)證服務(wù)SDK即可實(shí)現(xiàn)包括手機(jī)、郵箱在內(nèi)多種認(rèn)證方式的端到端注冊(cè)登錄流程,整個(gè)開(kāi)發(fā)流程半天到一天即可搞定,同時(shí)也比自有認(rèn)證系統(tǒng)更加安全。