📅  最后修改于: 2021-01-02 03:33:19             🧑  作者: Mango
使用电子邮件链接/无密码的Firebase SDK身份验证与使用电子邮件链接/密码的Firebase UI身份验证非常相似。我们可以通过向用户发送包含链接的电子邮件来使用Firebase身份验证来注册任何用户,然后他们可以单击该链接进行登录。在此过程中还将验证用户电子邮件地址。
使用电子邮件链接身份验证有很多优点:
低摩擦注册并登录
跨应用程序重复使用密码的风险较低,这甚至会破坏精选密码的安全性。
验证用户身份并确认该用户是电子邮件地址的合法所有者。用户只需要充当可访问的电子邮件即可登录,并且使用正确的密码列表,不需要电话号码,不需要社交媒体帐户。用户无需输入密码即可安全登录。以前使用电子邮件标识符登录的现有用户也可以升级为仅使用电子邮件登录。
如果用户忘记了密码,他们仍然可以登录而无需重设密码。因此,让我们开始编码部分,看看如何使用Firebase SDK实施电子邮件链接身份验证。
第1步:
在第一步中,我们必须执行以下准备步骤:
第2步:
在下一步中,我们必须启用电子邮件链接密码才能登录。我们必须同时启用电子邮件/密码和电子邮件链接。
第三步:
我们必须确保我们有一个动态链接,因为当我们选择链接,我们的应用程序需要捕获以便链接登录或注册火力地堡。
步骤4:
在下一步中,我们将以与Firebase UI电子邮件链接身份验证相同的方式添加域。您的域名将与操作代码设置匹配,我们将在下一步中对其进行定义。
步骤5:
我们要做的最后一步是确保我们的项目具有SHA-1和SHA-256密钥。我们将以与上一节Firebase UI:使用电子邮件链接进行身份验证相同的方式设置SHA-1和SHA-256密钥。
步骤6:
下一步是实现一个活动布局,该布局包含电子邮件的编辑文本以及两个用于sign_in和email_click的按钮,方法如下:
步骤7:
在下一步中,我们将修改MainActivity.java以使用Firebase SDK通过以下方式实现电子邮件链接身份验证:
public class MainActivity extends AppCompatActivity {
//Declaration of EditText, Button, FirebaseAuth, String and SharedPreferences
private EditText email;
private Button signin;
private String email_address, email_link,pending_email;
String TAG="EMAIL_AUTH";
FirebaseAuth auth;
private SharedPreferences pref;
private static final String KEY_PENDING_EMAIL="key_pending_email";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Fetching id?s of EditText and button
email=(EditText)findViewById(R.id.editText);
signin=(Button)findViewById(R.id.SignInButton);
//Making button disable
signin.setEnabled(false);
//Getting instances of FirebaseAuth
auth=FirebaseAuth.getInstance();
//Reading preferences if it?s already been set
pref=getApplicationContext().getSharedPreferences("MyPref", Context.MODE_PRIVATE);
pending_email=pref.getString(KEY_PENDING_EMAIL,null);
//Checking for pending email?.
if(pending_email!=null){
email.setText(pending_email);
Log.d(TAG,"Getting Shared Preferences"+pending_email);
}
//Creating intent for catching the link
Intent intent = getIntent();
if (intent != null && intent.getData() != null) {
email_link = intent.getData().toString();
Log.d(TAG, "got an intent: " + email_link);
// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(email_link)) {
signin.setEnabled(true);
}
}
}
//Implementing event handlers
public void onSignInClickedButton(View view) {
//Getting email address from the text field
email_address = email.getText().toString();
//Calling signInWithEmailLink using the FirebaseAuth instances with OnCompleteListener and OnComplete callback.
auth.signInWithEmailLink(email_address, email_link)
.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
// remove shared preferences, set everything back to default
pending_email = null;
SharedPreferences.Editor editor = pref.edit();
editor.remove(KEY_PENDING_EMAIL);
editor.commit();
email.setText("");
//Checking for task
if (task.isSuccessful()) {
Toast.makeText(getApplicationContext(), "Successfully signed in with email link!", Toast.LENGTH_SHORT).show();
AuthResult result = task.getResult();
} else {
Toast.makeText(getApplicationContext(), "Error signing in with email link", Toast.LENGTH_SHORT).show();
}
}
});
}
public void onEmailClick(View view) {
email_address = email.getText().toString();
//Validation check
if (email_address.equals("")) {
Toast.makeText(getApplicationContext(), "Enter Email Address!", Toast.LENGTH_SHORT).show();
return;
}
//Save Email Address using SharedPreference Editor.
SharedPreferences.Editor editor=pref.edit();
editor.putString(KEY_PENDING_EMAIL,email_address);
editor.commit();
//Set-up our ActionCodeSettings
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder()
.setAndroidPackageName(
getPackageName(),
false, /* install if not available? */
null /* minimum app version */)
.setHandleCodeInApp(true)
.setUrl("https://auth.example.com/emailSignInLink")
.build();
//Implement sendSignInLinkToEmail method to send the link to email address
auth.sendSignInLinkToEmail(email_address, actionCodeSettings)
.addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
Toast.makeText(getApplicationContext(), "Email Sent", Toast.LENGTH_LONG).show();
}
}
});
}
}
输出: