眾所周知,一般想要開發(fā)一個(gè)社交應(yīng)用需要客戶端服務(wù)器等很多模塊配合才能夠?qū)崿F(xiàn)。尤其是登錄系統(tǒng),想要構(gòu)建一個(gè)安全高效的登錄需要大量的開發(fā)維護(hù)工作。今天就教大家如何不需要搭建任何服務(wù)器就可以完成一個(gè)簡單的社交應(yīng)用登錄系統(tǒng)開發(fā)。
我們的登錄認(rèn)證系統(tǒng)使用的是華為AppGallery Connect認(rèn)證服務(wù),首先簡單介紹一下AppGallery Connect,AppGallery Connect(簡稱AGC),致力于為開發(fā)者提供應(yīng)用創(chuàng)意、開發(fā)、分發(fā)、運(yùn)營、分析全生命周期服務(wù),構(gòu)建全場景智慧化的應(yīng)用生態(tài)。目前,AGConnect已經(jīng)開通了87項(xiàng)服務(wù)。
華為AGC認(rèn)證服務(wù)就提供了一套完整的手機(jī)號和郵箱地址注冊登錄系統(tǒng)。
首先,對于新的用戶,認(rèn)證服務(wù)提供了賬號的注冊系統(tǒng)。首先看下我們的應(yīng)用注冊界面:
手機(jī)號注冊與郵箱注冊的具體流程大致相同,以手機(jī)號碼注冊流程為例:
認(rèn)證服務(wù)SDK提供了內(nèi)置的驗(yàn)證碼發(fā)送功能,應(yīng)用不需要自己去找通訊供應(yīng)商開通發(fā)送驗(yàn)證碼的服務(wù),非常方便。郵箱認(rèn)證也提供了發(fā)送郵箱驗(yàn)證碼的功能,只需要調(diào)用AGConnectAuth.requestVerifyCode傳入用戶信息就可以請求驗(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);
}
在我們的注冊頁面中,也可以看到一個(gè)輸入密碼的輸入框,這里SDK又提供了一個(gè)很便捷的功能。認(rèn)證服務(wù)給用戶提供了驗(yàn)證碼和密碼兩種登錄方式。用戶在注冊的時(shí)候可以選擇是否給自己的賬號設(shè)置一個(gè)密碼,如果密碼這里選擇了設(shè)置,那后續(xù)登錄的時(shí)候就可以使用密碼的方式來登錄,如果沒有在注冊時(shí)設(shè)置,則可以通過驗(yàn)證碼的方式來登錄。注冊成功后,SDK會自動(dòng)幫用戶進(jìn)行登錄,無需再跳轉(zhuǎn)回登錄界面重新登錄。我們開發(fā)的社交登錄系統(tǒng)注冊的時(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());
});
對于已經(jīng)注冊的用戶,我們同樣提供了使用手機(jī)號或郵箱登錄的能力。下面我們的登錄界面:
由于我們的應(yīng)用只設(shè)置了使用密碼登錄,所以在剛剛的注冊環(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ù)會返回一個(gè)當(dāng)前用戶的唯一ID,開發(fā)者可以根據(jù)這個(gè)ID來區(qū)分不同的用戶??梢钥吹轿覀兊牡卿浗缑孢€有一個(gè)匿名登錄的選項(xiàng)。這個(gè)也是認(rèn)證服務(wù)提供的。認(rèn)證服務(wù)提供了用戶的匿名模式,用戶可以不注冊不登錄,通過匿名的方式來體驗(yàn)應(yīng)用的功能,通俗點(diǎn)說就是游客模式,這樣可以給用戶一個(gè)試用的機(jī)會,提高應(yīng)用轉(zhuǎn)化率,有興趣的可以參考文檔實(shí)現(xiàn)。
登錄成功后,我們來到了圖片展示頁面:
這個(gè)頁面分為兩個(gè)部分,第一部分為標(biāo)題部分,分為用戶的名稱以及三個(gè)操作的按鈕,分別為添加圖片,刷新與退出登錄。用戶的名稱是通過認(rèn)證服務(wù)登錄成功以后的返回信息里獲取的。退出登錄則用到了認(rèn)證服務(wù)的退出登錄功能,退出后界面會就返回到之前的登錄界面,退出登錄的功能實(shí)現(xiàn)就不贅述了,調(diào)用signout接口即可。
而頁面下半部分的圖片展示則使用到了AGC的云存儲云數(shù)據(jù)庫等功能,這些功能也是基于認(rèn)證服務(wù)來實(shí)現(xiàn)的。認(rèn)證服務(wù)可以為云存儲與云數(shù)據(jù)庫提供憑證,例如云數(shù)據(jù)庫服務(wù)需要認(rèn)證服務(wù)的權(quán)限認(rèn)證才可以進(jìn)行增刪改等操作。具體這些服務(wù)是怎么應(yīng)用到我們的App中的,我將在以后的文章中為大家介紹。
總結(jié):
使用華為AGC認(rèn)證服務(wù)免除了自己搭建服務(wù)器進(jìn)行登錄認(rèn)證的煩惱,僅通過集成認(rèn)證服務(wù)SDK即可實(shí)現(xiàn)包括手機(jī)、郵箱在內(nèi)多種認(rèn)證方式的端到端注冊登錄流程,整個(gè)開發(fā)流程半天到一天即可搞定,同時(shí)也比自有認(rèn)證系統(tǒng)更加安全。