ثبت‌نام/ورود - Android

در این بخش از مستند اندروید قصد داریم اعمال ساده‌ای که برای کار با کاربر مورد نیاز اپلیکیشن‌های شماست را به همراه مثال نشان دهیم. همه اعمالی که به کاربر مرتبط است در کلاس BacktoryUser قرار گرفته است و شما تقریبا در همه مثال‌ها آن را خواهید دید.

پیش‌نیازها

  1. در صورتی که با سرویس کاربران بکتوری آشنایی ندارید، به معرفی سرویس کاربران مراجعه کنید.
  2. در صورتی که هنوز SDK اندروید را راه‌اندازی نکرده‌اید، به راه‌اندازی SDK بکتوری در اندروید مراجعه کنید.

ثبت‌نام

با استفاده از این سرویس، کاربر می تواند پس از وارد کردن اطلاعات خود، در سیستم ثبت‌نام کند. معمولاً کاربر برای ثبت‌نام لازم است که حداقل نام‌کاربری و رمز عبور خود را وارد کند. در صورتی که کاربران شما ایمیل خود را نیز وارد می‌کنند و می‌خواهید حتما ایمیل‌ها تایید شده باشند لازم است که برای پروژه خود، تایید ثبت‌نام از طریق ایمیل را فعال کنید. با این کار کاربرانی که ثبت‌نام می‌کنند تا زمانی که از طریق ایمیل، ثبت‌نام خود را تایید نکنند، در سیستم غیر‌فعال هستند. در پروژه‌هایی که گزینه تایید ایمیل (از طریق پنل بکتوری) فعال نباشد، همه کاربران به محض ثبت‌نام (و بدون نیاز به تایید از طریق ایمیل) فعال می‌گردند.

برای ثبت‌نام با نام‌کاربری و گذرواژه سرویس زیر در کلاس BacktoryUser را استفاده می‌کنیم.

// First create a user and fill his/her data
BacktoryUser newUser = new BacktoryUser.
    Builder().
    setFirstName("Alireza").
    setLastName("Farahani").
    setUsername("a_farahani").
    setEmail("ali.farahani@gmail.com").
    setPassword("123456").
    setPhoneNumber("09121234567").
    setAvatar("mydomain.com/avatar.png").
    build();

// Registring user to backtory (in background)
newUser.registerInBackground(new BacktoryCallBack<BacktoryUser>() {

    // Register operation done (fail or success), handling it:
    @Override
    public void onResponse(BacktoryResponse<BacktoryUser> response) {
        // Checking result of operation
        if (response.isSuccessful()) {
            // Successful
            Log.d(TAG, "Register Success: new username is " + response.body().getUsername());
        } else if (response.code() == HttpStatusCode.Conflict.code()) {
            // Username is invalid
            Log.d(TAG, "Bad username: a user with this username already exist");
        } else {
            // General failure
            Log.d(TAG, "Registeration failed, for network or some other reasons");
        }
    }
});

همانطور که در مثال بالا می‌بینید در حالتی که عملیات موفق نباشد کد خطایی به شما بازگردانده خواهد شد که از طریق تابع ()response.code قابل دسترس است. برای سرویس ثبت‌نام انواع کدهای جواب ممکن به صورت جدول زیر است:

Tables Description
201-Created Successful registration
404-Not Found Your Authentication-Id is wrong
409-Conflict User with same username already exists
500-Internal Server Error Data access was unsuccessful
503-Service Unavailable Your service is disabled

ورود کاربر

در SDK شما می‌توانید به سادگی با داشتن نام‌کاربری و رمزعبور کاربر وارد شوید. در صورتی که به صورت شخصی تمایل دارید به مکانیزم امنیتی بکتوری به صورت عمیق‌تر و دقیق آشنا شوید، فرآیند امنیتی ورود کاربران را مطالعه کنید. آن چیزی که در SDK لازم است بدانید این است که به کمک loginInBackground می‌توانید کاربر دلخواه خود را در اپلیکیشن وارد کنید. تکه کد زیر یک نمونه ساده از این کار را نشان می‌دهد:

// Fetch username/password from UI or anywhere you desire
String username = "mohx";
String password = "123456"

// Pass user info to login
BacktoryUser.loginInBackground(username, password, 
    new BacktoryCallBack<Void>() {

    // Login operation done (fail or success), handling it:
    @Override
    public void onResponse(BacktoryResponse<Void> response) {
        // Checking result of operation
        if (response.isSuccessful()) {
            // Login successfull
            Log.d(TAG, "Wellcome " + username);
        } else if (response.code() == HttpStatusCode.Unauthorized.code()) {
            // Username 'mohx' with password '123456' is wrong
            Log.d(TAG, "Either username or password is wrong");
        } else {
            // Operation generally failed, maybe internet connection issue
            Log.d(TAG, "Login failed for other reasons like network issues");
        }
    }

});

پس از لاگین کردن، sdk توکن دسترسی شما را در خودش حفظ می‌کند و در نتیجه، نیازی نیست که هربار برای ورود به برنامه لاگین کنید. در صورتی که بخواهید sdk توکن دسترسی شما را حذف کند، باید از خروج کاربر استفاده کنید.

همانطور که در کد بالا دیده می‌شود در حالتی که مقدار isSuccessful برابر با true باشد عملیات ورود با موفقیت انجام شده است. در غیر این صورت مقدار ()response.code نمایانگر نوع خطا است. مقادیر مختلفی که ()response.code می‌تواند داشته باشد به صورت زیر است:

Tables Description
200-OK Login was successfull
401-Unauthorized Username or password is incorrect
417-Expectation Failed InstanceId or ClientKey does not match
500-Internal Server Error Data access was unsuccessful
503-Service Unavailable Your service is disabled

گرفتن اطلاعات کاربر فعلی

بعد از انجام عملیات login شما می‌توانید به اطلاعات کاربر وارد شده دسترسی داشته باشید. کافی است سرویس زیر از کلاس BacktoryUser را فراخوانی کنید.

// Get current user from backtory
BacktoryUser currentUser = BacktoryUser.getCurrentUser();

// Check if currentUser is not empty
if (currentUser != null) {
    // Log the result to output
    String firstname = currentUser.getFirstName();
    String username = currentUser.getUsername();
    String userID = currentUser.getUserId();

    Log.d(TAG, "firstname: " + firstname + " and username: " + username);
} else {
    // No user is logged-in
    Log.d(TAG, "No user is logged in right now");
}

هر بار که شما کاربر فعلی بکتوری را خروج کنید و یا اطلاعات او را به روزرسانی کنید مقدار getCurrentUser نیز متناسب با تغییرات تغییر خواهد کرد.

ویرایش/به‌روزرسانی پروفایل کاربر

کاربر اپلیکیشن شما می‌تواند اطلاعات خود شامل نام کاربری، نام، نام خانوادگی، ایمیل و شماره تلفن خود را به دلخواه تغییر دهد. لازم به ذکر است که تغییر رمزعبور نیز به دلیل امنیتی در سرویس مجزایی امکان‌پذیر است و در این سرویس امکان تغییر آن نیست. برای تغییر پروفایل خود کافیست به سادگی موجود BacktoryUser را تغییر داده و فرمان update بدهید. تکه کد زیر یک نمونه ساده از انجام این کار است:

// Get current user of system
BacktoryUser currentUser = BacktoryUser.getCurrentUser();

// Change his/her profile
currentUser.setFirstName("my new name");
currentUser.setLastName("my new lastname");
currentUser.setUsername("my new username");

// Send update command to backtory servers
currentUser.updateInBackground(new BacktoryCallBack<BacktoryUser>() {

    // Operation done (fail or success), handling it:
    @Override
    public void onResponse(BacktoryResponse<BacktoryUser> response) {
        // Checking whether operation was OK or not
        if (response.isSuccessful()) {
            // It was OK :)
        	Log.d(TAG, "your user updated successfully");
        } else {
            // It failed :(
            Log.d(TAG, "request failed");
        }
    }
});

در صورتی که خطایی ایجاد شود و یا مشکلی وجود داشته باشد عبارت ()response.code نوع خطا را مشخص خواهد کرد که یکی از مقادیر زیر خواهد بود:

Tables Description
200-OK Login was successfull
400-Bad Request Invalid email address. Or firstname, lastname, or username length is more than 40 characters.
401-Unauthorized Username or password is incorrect
417-Expectation Failed InstanceId or ClientKey does not match
500-Internal Server Error Data access was unsuccessful
503-Service Unavailable Your service is disabled

اطلاعات اضافی (Additional Fields)

می‌توان به یک کاربر اطلاعات دلخواه افزود و بازیابی کرد. به طور مثال، برای اضافه کردن آدرس کاربر کدی مانند زیر به کار می‌آید:

BacktoryUser user = BacktoryUser.getCurrentUser();
user.put("address", "Tehran, First Alley!, No 7");
// Save the user with user.updateInBackground

حال اگر بخواهیم این اطلاعات اضافه را بازیابی کنیم، به شیوه‌ی زیر عمل می‌کنیم:

String address = user.get("address"); // Returns null when user doesn’t contain such key.

دقت کنید که این اطلاعات اضافی تنها باید از جنس رشته باشند. هم‌چنین، قابلیت جستار بر روی فیلدهایی که به کاربر اضافه می شوند، وجود ندارد. چنانچه نیاز به جستار با توجه به این فیلدها دارید، در سرویس پایگاه داده‌ی خود جدولی تعریف کنید که از طریق شناسه‌ی کاربری (userId) به جدول کاربران مرتبط باشد و فیلدهای اضافی کاربر را درون آن بریزید.

خروج کاربر از اپلیکیشن

در صورتی که می‌خواهید کاربر از اپلیکیشن خارج شود، باید به صورت زیر به SDK بکتوری اعلام کنید.

BacktoryUser.logoutInBackground();

به این ترتیب ما توانستیم یک کاربر ثبت‌نام کنیم و ورود انجام دهیم. در مرحله بعد با نوع خاصی از کاربران به نام کاربر مهمان آشنا خواهیم شد.

گام بعدی