- طراحی اپلیکیشن
- زمان 13 دقیقه
برای نشان دادن این که استفاده از فایربیس چقدر آسان است، یک برنامهی سادهی ثبت نام و لاگین(firebase authentication) با استفاده از ایمیل و پسورد فایربیس ایجاد خواهیم کرد. همچنین به همراه نصب فایربیس یک مجموعهی کامل از امکانات لازم برای ثبت نام نیز نصب میشود. فایربیس به صورت خودکار، گواهینامه(credential)های امنیتی کاربران شما را به کد شده با استفاه از bcrypt ذخیره می کند.
- خصوصیات فایربیس
- مزایای استفاده از فایربیس
- تعدادی از معایب فایربیس
- 1. فعال کردن Firebase Auth
- 2.1 sign up با ایمیل و پسورد
- 2.2 لاگین با ایمیل و رمز
- 2.3 فراموشی رمز- ارسال ایمیل برای بازیابی رمز
- چک کردن نشست کاربر
- تغییر رمز
- تغییر ایمیل
- حذف کاربر
- خروج کاربر (sign out)
- 2.4 صفحه حساب کاربری- کنارهم قرار دادن تمام قطعات
به علاوه رونوشتی از بکآپ روزانه در خارج از سایت نگه میدارد. این کار گواهینامههای امنیتی حساس کاربر را از دادههای مربوط به اپلیکیشن جدا میکند و به شما اجازه میدهد که برروی رابطکاربری و تجربهیکاربری برنامه متمرکز شوید. با مقاله فعال کردن Firebase Auth مزایا استفاده از فایربیس با تیک4 همراه باشید.
خصوصیات فایربیس
فایربیس با دستهای از امکاناتی که برای هر برنامهی اندروید مورد نیاز است، از ثبت نام تا میزبانی از برنامه ارائه شده است.
مزایای استفاده از فایربیس:
- پیاده سازی بسیار ساده و سریع
- عدم نیاز به پیکربندی(کانفیگ) سمت سرور؛ عدم نیاز به اسکریپت پی اچ پی و عدم نیاز به طراحی دیتابیس
- بروزرسانی لحظهای (Realtime) بدون نیاز به GCM
- مقیاسپذیری خودکار (Atuoscalling) درونی
- شروع رایگان (فقط وقتی که به 50 کانکشن رسیدیم پول پرداخت می کنیم)
- Api ی قدرتمند برای جاوااسکریپت(شامل فریمورکهایی مثل آنگولار)، iOS و اندروید
- پشتیبانی درونی از سرویس احراز هویت، مثل فیسبوک، گوگل، و توییتر
- قوانین امنیتی با مدل اعلانی(Declarative Security Rules model) که امکان اعمال اجازهی خواندن و نوشتن (سطوح دسترسی) و اعتبارسنجی دیتا در سراسر درخت(tree) را به ما می دهد.
تعدادی از معایب فایربیس
- نیاز به ایندکس کردن دستی
- همچنین شاید نیاز به ساخت ایونت لاگ (event log) به صورت دستی، وجود داشته باشد(در زیردرختهای مجزا)
- پیادهسازی REST APIبرای پلتفرمهای امبد(embed) شده ممکن است مشکل باشد.
- قوانین اعتبارسنجی داده از اشیاء پیچیده، پشتیبانی نمیکنند(شما نیاز خواهید داشت که تکتک گرههای فرزند را به طور جداگانه اعتبار سنجی کنید)
1. فعال کردن Firebase Auth
- اولین چیزی که باید انجام دهید این است که به آدرس https://firebase.google.com/ بروید و برای دسترسی به کنسول، حساب کاربری ایجاد کنید. بعد از اینکه به کنسول دسترسی پیدا کردید شما می توانید با ایجاد اولین پروژهتان، شروع کنید.
- نام بستهی پروژهای که میخواهید با فایربیس یکپارچه کنید(در مورد این مطلب tik4.firebase است) را وارد کنید. در این موقع وقتی که دکمه ی add را فشار دهید، فایل google-services.json دانلود خواهد شد.
- بعد به داشبورد پروژهتان بروید. Auth را بیابید و بر روی آن کلیک کنید. بروید به قسمت تنظیمات «sign in method» و «Email & Password» را انتخاب و فعال کنید. با ادامه مقاله فعال کردن Firebase Auth مزایا استفاده از فایربیس همراه ما باشید.
حالا برای شروع پروژهی اندرویدمان آماده هستیم. ما میخواهیم یک اپلیکیشن ساده که شامل احراز هویت با فایربیس و مدیریت پروفایل است بسازیم. در مجموع ما خواهیم دید که چطور امکان login، Registration، Forgot Password، Change Email، Change Password، و در نهایت sign Out را اضافه کنیم.
- ایجاد پروژهی اندروید
- یک پروژه ی جدید در اندروید استادیو از قسمت File=> New Project ایجاد کنید. وقتی که از شما خواسته می شود که فعالیت پیش فرض را انتخاب کنید، Bank Activity را انتخاب کنید و پیش بروید.
وقتی که جزئیات پروژه را پر می کنید، از همان اسمی که در کنسول فایربیس برای بسته استفاده کردید، استفاده کنید. در مورد این مطلب اسم tik4.firebase است.
- AndroidManifest.xml را باز کنید و پرمیشن INTERNET را اضافه کنید، چون ما احتیاج به در خواست تحت شبکه داریم. با ادامه مقاله فعال کردن Firebase Auth مزایا استفاده از فایربیس همراه ما باشید.
<uses-permission android:name="android.permission.INTERNET" />
- فایل google-services.json را داخل پوشه ی appپروژه قرار دهید. این گام بسیار مهم است چون پروژه ی شما بدون این فایل ساخته نخواهد شد.
- حالا فایل build.gradle که در پوشه ی home پروژه ی شما قرار دارد را باز کنید و وابستگی فایربیس را اضافه کنید.
build.gradle dependencies { classpath 'com.android.tools.build:gradle:2.1.2' classpath 'com.google.gms:google-services:3.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }
5.فایل app/build.gradle را باز کنید و وابستگی firebase auth را به این فایل اضافه کنید. در انتهای فایل کد زیر را اضافه کنید. apply plugin: ‘com.google.gms.google-services’
app/build.gradle dependencies { compile "com.google.firebase:firebase-auth:9.0.2" } apply plugin: 'com.google.gms.google-services'
- resource های زیر را به dimens.xml ، colors.xml و strings.xml اضافه کنید. این resource ها مورد نیاز خود فایربیس نیست و برای این پروژه اضافه می شود.
dimens.xml <resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> <dimen name="fab_margin">16dp</dimen> <dimen name="logo_w_h">100dp</dimen> </resources>
colors.xml <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#00bcd4</color> <color name="colorPrimaryDark">#0097a7</color> <color name="colorAccent">#f2fe71</color> <color name="bg_login">#26ae90</color> <color name="bg_register">#2e3237</color> <color name="bg_main">#428bca</color> <color name="white">#ffffff</color> <color name="input_login">#222222</color> <color name="input_login_hint">#999999</color> <color name="input_register">#888888</color> <color name="input_register_bg">#3b4148</color> <color name="input_register_hint">#5e6266</color> <color name="btn_login">#26ae90</color> <color name="btn_login_bg">#eceef1</color> <color name="lbl_name">#333333</color> <color name="btn_logut_bg">#ff6861</color> </resources>
strings.xml <resources> <string name="app_name">Firebase Auth</string> <string name="action_sign_in_short">Register</string> <string name="email">Email</string> <string name="minimum_password">Password too short, enter minimum 6 characters!</string> <string name="auth_failed">Authentication failed, check your email and password or sign up</string> <string name="change_email">Change Email</string> <string name="change_password">Change Password</string> <string name="send_password_reset_email">Send Password reset email</string> <string name="remove_user">Remove user</string> <string name="new_pass">New Password</string> <string name="title_activity_profile">Firebase</string> <string name="title_activity_login">Sign in</string> <string name="hint_email">Email</string> <string name="hint_password">Password</string> <string name="hint_name">Fullname</string> <string name="btn_login">LOGIN</string> <string name="btn_link_to_register">Not a member? Get registered in Firebase now!</string> <string name="btn_link_to_login">Already registered. Login Me!</string> <string name="title_activity_reset_password">ResetPasswordActivity</string> <string name="btn_forgot_password">Forgot your password?</string> <string name="btn_reset_password">Reset Password</string> <string name="btn_back"><![CDATA[<< Back]]></string> <string name="hint_new_email">New Email</string> <string name="btn_change">Change</string> <string name="btn_send">Send</string> <string name="btn_remove">Remove</string> <string name="btn_sign_out">Sign Out</string> <string name="lbl_forgot_password">Forgot password?</string> <string name="forgot_password_msg">We just need your registered Email Id to sent you password reset instructions.</string> </resources>
اکنون ما یک پروژه با تمام dependency های مورد نیاز داریم. اکنون شروع به اضافه کردن صفحه ی sign up به پروژه می کنیم.
2.1 sign up با ایمیل و پسورد
صحفه ی sign up شامل دو فیلد EditText برای ایمیل و پسورد است. و چند دکمه برای ناوبری(navigat) به صفحات لاگین و فراموشی رمز
- یک اکتیویتی به نام SignupActivity.java ایجاد کنید و کد زیر را به لایه ی activity_signup.xml اضافه کنید.
activity_signup.xml <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="tik4.firebase.LoginActivity"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/colorPrimaryDark" android:gravity="center" android:orientation="vertical" android:padding="@dimen/activity_horizontal_margin"> <ImageView android:layout_width="@dimen/logo_w_h" android:layout_height="@dimen/logo_w_h" android:layout_gravity="center_horizontal" android:layout_marginBottom="30dp" android:src="@mipmap/ic_launcher" /> <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/email" android:inputType="textEmailAddress" android:maxLines="1" android:singleLine="true" android:textColor="@android:color/white" /> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusableInTouchMode="true" android:hint="@string/hint_password" android:imeActionId="@+id/login" android:imeOptions="actionUnspecified" android:inputType="textPassword" android:maxLines="1" android:singleLine="true" android:textColor="@android:color/white" /> </android.support.design.widget.TextInputLayout> <Button android:id="@+id/sign_up_button" style="?android:textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:background="@color/colorAccent" android:text="@string/action_sign_in_short" android:textColor="@android:color/black" android:textStyle="bold" /> <Button android:id="@+id/btn_reset_password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" android:background="@null" android:text="@string/btn_forgot_password" android:textAllCaps="false" android:textColor="@color/colorAccent" /> <!-- Link to Login Screen --> <Button android:id="@+id/sign_in_button" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" android:background="@null" android:text="@string/btn_link_to_login" android:textAllCaps="false" android:textColor="@color/white" android:textSize="15dp" /> </LinearLayout> <ProgressBar android:id="@+id/progressBar" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center|bottom" android:layout_marginBottom="20dp" android:visibility="gone" /> </android.support.design.widget.CoordinatorLayout>
- 8. SignupActivity.java و مواردی که در ادامه می آید را اضافه کنید. فایربیس متد createUserWithEmailAndPassword() را درست می کند(provide) برای ایجاد یک کاربر جدید با داده های مربوط به ایمیل و پسورد.
SignupActivity.java package tik4.firebase; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; public class SignupActivity extends AppCompatActivity { private EditText inputEmail, inputPassword; private Button btnSignIn, btnSignUp, btnResetPassword; private ProgressBar progressBar; private FirebaseAuth auth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup); //Get Firebase auth instance auth = FirebaseAuth.getInstance(); btnSignIn = (Button) findViewById(R.id.sign_in_button); btnSignUp = (Button) findViewById(R.id.sign_up_button); inputEmail = (EditText) findViewById(R.id.email); inputPassword = (EditText) findViewById(R.id.password); progressBar = (ProgressBar) findViewById(R.id.progressBar); btnResetPassword = (Button) findViewById(R.id.btn_reset_password); btnResetPassword.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(SignupActivity.this, ResetPasswordActivity.class)); } }); btnSignIn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); btnSignUp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String email = inputEmail.getText().toString().trim(); String password = inputPassword.getText().toString().trim(); if (TextUtils.isEmpty(email)) { Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show(); return; } if (TextUtils.isEmpty(password)) { Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show(); return; } if (password.length() < 6) { Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show(); return; } progressBar.setVisibility(View.VISIBLE); //create user auth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(SignupActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { Toast.makeText(SignupActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show(); progressBar.setVisibility(View.GONE); // If sign in fails, display a message to the user. If sign in succeeds // the auth state listener will be notified and logic to handle the // signed in user can be handled in the listener. if (!task.isSuccessful()) { Toast.makeText(SignupActivity.this, "Authentication failed." + task.getException(), Toast.LENGTH_SHORT).show(); } else { startActivity(new Intent(SignupActivity.this, MainActivity.class)); finish(); } } }); } }); } @Override protected void onResume() { super.onResume(); progressBar.setVisibility(View.GONE); } }
فایل AndroidManifest.xml را باز کنید و SignupActivity را به عنوان لانچر اکتیویتی(موقتاً) بسازید و sign up را تست کنید.
اگر به کنسول فایربیس لاگین کنید، میتوانید ببینید که کاربری با شناسهی ایمیلی که شما به اپلیکیشن دادهاید ایجاد شده است.
2.2 لاگین با ایمیل و رمز
حالا میخواهیم صفحهی ورود(لاگین) را درست کنیم و دادههایی که در قسمت ثبت نام وارد کردیم را بررسی کنیم.
- یک اکتیویتی دیگر به نام LoginActivity.java و کد زیر را به لایه ی activity_login.xml آن اضافه میکنیم.
activity_login.xml <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="tik4.firebase.LoginActivity"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/colorPrimary" android:gravity="center" android:orientation="vertical" android:padding="@dimen/activity_horizontal_margin"> <ImageView android:layout_width="@dimen/logo_w_h" android:layout_height="@dimen/logo_w_h" android:layout_gravity="center_horizontal" android:layout_marginBottom="30dp" android:src="@mipmap/ic_launcher" /> <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:hint="@string/hint_email" android:inputType="textEmailAddress" android:textColor="@android:color/white" android:textColorHint="@android:color/white" /> </android.support.design.widget.TextInputLayout> <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:hint="@string/hint_password" android:inputType="textPassword" android:textColor="@android:color/white" android:textColorHint="@android:color/white" /> </android.support.design.widget.TextInputLayout> <!-- Login Button --> <Button android:id="@+id/btn_login" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" android:background="@color/colorAccent" android:text="@string/btn_login" android:textColor="@android:color/black" /> <Button android:id="@+id/btn_reset_password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" android:background="@null" android:text="@string/btn_forgot_password" android:textAllCaps="false" android:textColor="@color/colorAccent" /> <!-- Link to Login Screen --> <Button android:id="@+id/btn_signup" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" android:background="@null" android:text="@string/btn_link_to_register" android:textAllCaps="false" android:textColor="@color/white" android:textSize="15dp" /> </LinearLayout> <ProgressBar android:id="@+id/progressBar" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center|bottom" android:layout_marginBottom="20dp" android:visibility="gone" /> </android.support.design.widget.CoordinatorLayout>
10) فایل loginActivity.java را باز کنید و تغییرات زیر را در آن اعمال کنید. فایربیس متدsignInWithEmailAndPassword() را برای امکان وارد شدن کاربر ایجاد میکند.
LoginActivity.java package tik4.firebase; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; public class LoginActivity extends AppCompatActivity { private EditText inputEmail, inputPassword; private FirebaseAuth auth; private ProgressBar progressBar; private Button btnSignup, btnLogin, btnReset; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Get Firebase auth instance auth = FirebaseAuth.getInstance(); if (auth.getCurrentUser() != null) { startActivity(new Intent(LoginActivity.this, MainActivity.class)); finish(); } // set the view now setContentView(R.layout.activity_login); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); inputEmail = (EditText) findViewById(R.id.email); inputPassword = (EditText) findViewById(R.id.password); progressBar = (ProgressBar) findViewById(R.id.progressBar); btnSignup = (Button) findViewById(R.id.btn_signup); btnLogin = (Button) findViewById(R.id.btn_login); btnReset = (Button) findViewById(R.id.btn_reset_password); //Get Firebase auth instance auth = FirebaseAuth.getInstance(); btnSignup.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(LoginActivity.this, SignupActivity.class)); } }); btnReset.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(LoginActivity.this, ResetPasswordActivity.class)); } }); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String email = inputEmail.getText().toString(); final String password = inputPassword.getText().toString(); if (TextUtils.isEmpty(email)) { Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show(); return; } if (TextUtils.isEmpty(password)) { Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show(); return; } progressBar.setVisibility(View.VISIBLE); //authenticate user auth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { // If sign in fails, display a message to the user. If sign in succeeds // the auth state listener will be notified and logic to handle the // signed in user can be handled in the listener. progressBar.setVisibility(View.GONE); if (!task.isSuccessful()) { // there was an error if (password.length() < 6) { inputPassword.setError(getString(R.string.minimum_password)); } else { Toast.makeText(LoginActivity.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show(); } } else { Intent intent = new Intent(LoginActivity.this, MainActivity.class); startActivity(intent); finish(); } } }); } }); } }
پروژه را اجرا(run) کنید و اطلاعاتی که در موقع ثبت نام ثبت کردید را وارد کنید. با ادامه مقاله فعال کردن Firebase Auth مزایا استفاده از فایربیس همراه ما باشید.
2.3 فراموشی رمز- ارسال ایمیل برای بازیابی رمز
ویژگی مثبت دیگری که فایربیس فراهم کرده است، ارسال ایمیل بازیابی رمز به هنگام نیاز است. انجام این کار در صورتی که شما بخواهید ایمیل سرور خودتان را داشته باشید، کار بسیار مشکلی است.
12) یک اکتیویتی دیگر به نام ResetPasswordActivity.java ایجاد کنید و کد زیر را درون لایهی activity_reset_password.xml فایل اضافه کنید.
activity_reset_password.xml <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:background="@color/colorPrimary" android:fitsSystemWindows="true" tools:context="tik4.firebase.LoginActivity"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:gravity="center" android:orientation="vertical" android:padding="@dimen/activity_horizontal_margin"> <ImageView android:layout_width="@dimen/logo_w_h" android:layout_height="@dimen/logo_w_h" android:layout_gravity="center_horizontal" android:layout_marginBottom="10dp" android:src="@mipmap/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:padding="10dp" android:text="@string/lbl_forgot_password" android:textColor="@android:color/white" android:textSize="20dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:gravity="center_horizontal" android:padding="@dimen/activity_horizontal_margin" android:text="@string/forgot_password_msg" android:textColor="@android:color/white" android:textSize="14dp" /> <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginTop="20dp" android:hint="@string/hint_email" android:inputType="textEmailAddress" android:textColor="@android:color/white" android:textColorHint="@android:color/white" /> </android.support.design.widget.TextInputLayout> <!-- Login Button --> <Button android:id="@+id/btn_reset_password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dip" android:background="@color/colorAccent" android:text="@string/btn_reset_password" android:textColor="@android:color/black" /> <Button android:id="@+id/btn_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:background="@null" android:text="@string/btn_back" android:textColor="@color/colorAccent" /> </LinearLayout> <ProgressBar android:id="@+id/progressBar" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center|bottom" android:layout_marginBottom="20dp" android:visibility="gone" /> </android.support.design.widget.CoordinatorLayout>
13) فایل ResetPasswordActivity.java را باز کنید و و کد زیر را به آن اضافه کنید. شما می توانید از متد sendPasswordResetEmail() استفاده کنید برای ارسال ایمیل بازیابی رمز
ResetPasswordActivity.java package tik4.firebase; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; public class ResetPasswordActivity extends AppCompatActivity { private EditText inputEmail; private Button btnReset, btnBack; private FirebaseAuth auth; private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_reset_password); inputEmail = (EditText) findViewById(R.id.email); btnReset = (Button) findViewById(R.id.btn_reset_password); btnBack = (Button) findViewById(R.id.btn_back); progressBar = (ProgressBar) findViewById(R.id.progressBar); auth = FirebaseAuth.getInstance(); btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); btnReset.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String email = inputEmail.getText().toString().trim(); if (TextUtils.isEmpty(email)) { Toast.makeText(getApplication(), "Enter your registered email id", Toast.LENGTH_SHORT).show(); return; } progressBar.setVisibility(View.VISIBLE); auth.sendPasswordResetEmail(email) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(ResetPasswordActivity.this, "We have sent you instructions to reset your password!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(ResetPasswordActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show(); } progressBar.setVisibility(View.GONE); } }); } }); } }
اینجاست که ایمیل بازیابی رمز دریافت می شود. با ادامه مقاله فعال کردن Firebase Auth مزایا استفاده از فایربیس همراه ما باشید.
در زیر قطعات دیگری از کد برای عملیات دیگر مربوط به کاربر ارائه شده
چک کردن نشست کاربر
auth = FirebaseAuth.getInstance(); if (auth.getCurrentUser() != null) { // User is logged in }
تغییر رمز
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); user.updatePassword(newPassword.getText().toString().trim()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(MainActivity.this, "Password is updated!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Failed to update password!", Toast.LENGTH_SHORT).show(); progressBar.setVisibility(View.GONE); } } });
تغییر ایمیل
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); user.updateEmail(newEmail.getText().toString().trim()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(MainActivity.this, "Email address is updated.", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MainActivity.this, "Failed to update email!", Toast.LENGTH_LONG).show(); } } });
حذف کاربر
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if (user != null) { user.delete() .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(MainActivity.this, "Your profile is deleted:( Create a account now!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Failed to delete your account!", Toast.LENGTH_SHORT).show(); } } }); }
خروج کاربر (sign out)
auth.signOut(); // this listener will be called when there is change in firebase user session FirebaseAuth.AuthStateListener authListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user == null) { // user auth state is changed - user is null // launch login activity startActivity(new Intent(MainActivity.this, LoginActivity.class)); finish(); } } };
2.4 صفحه حساب کاربری- کنارهم قرار دادن تمام قطعات
حالا ما تمام عملکردها (functionality) هایی که در بالا ایجاد کردیم را در activity اصلی نگه میداریم و عملکرد اپلیکیشن را کامل می کنیم. فایل main activity را باز کنید و کد زیر را به آن اضافه کنید.
14) فایل activity_main.xml را باز کنید و کد زیر را به آن اضافه کنید. با ادامه مقاله فعال کردن Firebase Auth مزایا استفاده از فایربیس همراه ما باشید.
activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay" app:elevation="0dp"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimaryDark" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <EditText android:id="@+id/old_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_email" android:inputType="textEmailAddress" android:maxLines="1" android:singleLine="true" /> <EditText android:id="@+id/new_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_new_email" android:inputType="textEmailAddress" android:maxLines="1" android:singleLine="true" /> <EditText android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusableInTouchMode="true" android:hint="@string/prompt_password" android:imeActionId="@+id/login" android:imeOptions="actionUnspecified" android:inputType="textPassword" android:maxLines="1" android:singleLine="true" /> <EditText android:id="@+id/newPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusableInTouchMode="true" android:hint="@string/new_pass" android:imeActionId="@+id/login" android:imeOptions="actionUnspecified" android:inputType="textPassword" android:maxLines="1" android:singleLine="true" /> <Button android:id="@+id/changeEmail" style="?android:textAppearanceSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:background="@color/colorPrimaryDark" android:text="@string/btn_change" android:textColor="@android:color/white" android:textStyle="bold" /> <Button android:id="@+id/changePass" style="?android:textAppearanceSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:background="@color/colorPrimaryDark" android:text="@string/btn_change" android:textColor="@android:color/white" android:textStyle="bold" /> <Button android:id="@+id/send" style="?android:textAppearanceSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:background="@color/colorPrimaryDark" android:text="@string/btn_send" android:textColor="@android:color/white" android:textStyle="bold" /> <ProgressBar android:id="@+id/progressBar" android:layout_width="30dp" android:layout_height="30dp" android:visibility="gone" /> <Button android:id="@+id/remove" style="?android:textAppearanceSmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:background="@color/colorPrimaryDark" android:text="@string/btn_remove" android:textColor="@android:color/white" android:textStyle="bold" /> <Button android:id="@+id/change_email_button" style="?android:textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="@string/change_email" android:textStyle="bold" /> <Button android:id="@+id/change_password_button" style="?android:textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="@string/change_password" android:textStyle="bold" /> <Button android:id="@+id/sending_pass_reset_button" style="?android:textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="@string/send_password_reset_email" android:textStyle="bold" /> <Button android:id="@+id/remove_user_button" style="?android:textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="@string/remove_user" android:textStyle="bold" /> <Button android:id="@+id/sign_out" style="?android:textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:background="@color/colorPrimary" android:text="@string/btn_sign_out" android:textColor="@android:color/white" android:textStyle="bold" /> </LinearLayout> </android.support.design.widget.CoordinatorLayout>
15) فایل MainActivity.java را باز کنید و کد زیر را به آن اضافه کنید. در واقع ما اینجا تمام عملکردهایی که قبلاً ایجاد کردیم را در یک فایل با هم ترکیب میکنیم.
MainActivity.java package tik4.firebase; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.Toast; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; public class MainActivity extends AppCompatActivity { private Button btnChangeEmail, btnChangePassword, btnSendResetEmail, btnRemoveUser, changeEmail, changePassword, sendEmail, remove, signOut; private EditText oldEmail, newEmail, password, newPassword; private ProgressBar progressBar; private FirebaseAuth.AuthStateListener authListener; private FirebaseAuth auth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle(getString(R.string.app_name)); setSupportActionBar(toolbar); //get firebase auth instance auth = FirebaseAuth.getInstance(); //get current user final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); authListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user == null) { // user auth state is changed - user is null // launch login activity startActivity(new Intent(MainActivity.this, LoginActivity.class)); finish(); } } }; btnChangeEmail = (Button) findViewById(R.id.change_email_button); btnChangePassword = (Button) findViewById(R.id.change_password_button); btnSendResetEmail = (Button) findViewById(R.id.sending_pass_reset_button); btnRemoveUser = (Button) findViewById(R.id.remove_user_button); changeEmail = (Button) findViewById(R.id.changeEmail); changePassword = (Button) findViewById(R.id.changePass); sendEmail = (Button) findViewById(R.id.send); remove = (Button) findViewById(R.id.remove); signOut = (Button) findViewById(R.id.sign_out); oldEmail = (EditText) findViewById(R.id.old_email); newEmail = (EditText) findViewById(R.id.new_email); password = (EditText) findViewById(R.id.password); newPassword = (EditText) findViewById(R.id.newPassword); oldEmail.setVisibility(View.GONE); newEmail.setVisibility(View.GONE); password.setVisibility(View.GONE); newPassword.setVisibility(View.GONE); changeEmail.setVisibility(View.GONE); changePassword.setVisibility(View.GONE); sendEmail.setVisibility(View.GONE); remove.setVisibility(View.GONE); progressBar = (ProgressBar) findViewById(R.id.progressBar); if (progressBar != null) { progressBar.setVisibility(View.GONE); } btnChangeEmail.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { oldEmail.setVisibility(View.GONE); newEmail.setVisibility(View.VISIBLE); password.setVisibility(View.GONE); newPassword.setVisibility(View.GONE); changeEmail.setVisibility(View.VISIBLE); changePassword.setVisibility(View.GONE); sendEmail.setVisibility(View.GONE); remove.setVisibility(View.GONE); } }); changeEmail.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressBar.setVisibility(View.VISIBLE); if (user != null && !newEmail.getText().toString().trim().equals("")) { user.updateEmail(newEmail.getText().toString().trim()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(MainActivity.this, "Email address is updated. Please sign in with new email id!", Toast.LENGTH_LONG).show(); signOut(); progressBar.setVisibility(View.GONE); } else { Toast.makeText(MainActivity.this, "Failed to update email!", Toast.LENGTH_LONG).show(); progressBar.setVisibility(View.GONE); } } }); } else if (newEmail.getText().toString().trim().equals("")) { newEmail.setError("Enter email"); progressBar.setVisibility(View.GONE); } } }); btnChangePassword.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { oldEmail.setVisibility(View.GONE); newEmail.setVisibility(View.GONE); password.setVisibility(View.GONE); newPassword.setVisibility(View.VISIBLE); changeEmail.setVisibility(View.GONE); changePassword.setVisibility(View.VISIBLE); sendEmail.setVisibility(View.GONE); remove.setVisibility(View.GONE); } }); changePassword.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressBar.setVisibility(View.VISIBLE); if (user != null && !newPassword.getText().toString().trim().equals("")) { if (newPassword.getText().toString().trim().length() < 6) { newPassword.setError("Password too short, enter minimum 6 characters"); progressBar.setVisibility(View.GONE); } else { user.updatePassword(newPassword.getText().toString().trim()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(MainActivity.this, "Password is updated, sign in with new password!", Toast.LENGTH_SHORT).show(); signOut(); progressBar.setVisibility(View.GONE); } else { Toast.makeText(MainActivity.this, "Failed to update password!", Toast.LENGTH_SHORT).show(); progressBar.setVisibility(View.GONE); } } }); } } else if (newPassword.getText().toString().trim().equals("")) { newPassword.setError("Enter password"); progressBar.setVisibility(View.GONE); } } }); btnSendResetEmail.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { oldEmail.setVisibility(View.VISIBLE); newEmail.setVisibility(View.GONE); password.setVisibility(View.GONE); newPassword.setVisibility(View.GONE); changeEmail.setVisibility(View.GONE); changePassword.setVisibility(View.GONE); sendEmail.setVisibility(View.VISIBLE); remove.setVisibility(View.GONE); } }); sendEmail.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressBar.setVisibility(View.VISIBLE); if (!oldEmail.getText().toString().trim().equals("")) { auth.sendPasswordResetEmail(oldEmail.getText().toString().trim()) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(MainActivity.this, "Reset password email is sent!", Toast.LENGTH_SHORT).show(); progressBar.setVisibility(View.GONE); } else { Toast.makeText(MainActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show(); progressBar.setVisibility(View.GONE); } } }); } else { oldEmail.setError("Enter email"); progressBar.setVisibility(View.GONE); } } }); btnRemoveUser.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { progressBar.setVisibility(View.VISIBLE); if (user != null) { user.delete() .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Toast.makeText(MainActivity.this, "Your profile is deleted:( Create a account now!", Toast.LENGTH_SHORT).show(); startActivity(new Intent(MainActivity.this, SignupActivity.class)); finish(); progressBar.setVisibility(View.GONE); } else { Toast.makeText(MainActivity.this, "Failed to delete your account!", Toast.LENGTH_SHORT).show(); progressBar.setVisibility(View.GONE); } } }); } } }); signOut.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { signOut(); } }); } //sign out method public void signOut() { auth.signOut(); } @Override protected void onResume() { super.onResume(); progressBar.setVisibility(View.GONE); } @Override public void onStart() { super.onStart(); auth.addAuthStateListener(authListener); } @Override public void onStop() { super.onStop(); if (authListener != null) { auth.removeAuthStateListener(authListener); } } }
حالا شما پایهی ساخت یک برنامهی سادهی ثبت نام و ورود با فایربیس را ساختهاید. امیدواریم از مقاله فعال کردن Firebase Auth مزایا استفاده از فایربیس بهره کافی را برده باشید از قسمت دیدگاه ها باما همراه باشید.
دیدگاه خود را بیان کنید
سلام اموزش ها تصویری بزارین داخل سایت
مرسی سایت خوبی دارین
با سلام و خسته نباشید
باتشکر از دیدگاه و زمانی که برای مطالعه این مطلب گذاشته اید.
پیشنهاد شما به تیم تولید محتوا ارجاء داده شد، و در برنامه های آتی قرار خواهد گرفت.
باتشکر از همراهی شما
سلام
کاربردی بود پیشنهاد میدم بروز بشه