Android Login Session System dengan Verifikasi Email (1)

Join Komunitas TipsKoding.com

Dalam tutorial ini kita akan belajar bagaimana membangun sebuah Sistem Login dalam android dengan PHP, MySQL dan SQLite.

Fitur:
• Login, Registrasi, Reset Password, Change Password
• Notifikasi via Email untuk proses registrasi.
• Reset Password via Email.
• PHP API untuk menghandel JSON Login request.
• MySQL untuk menyimpan data user.
• SQLite untuk menyimpan data login, dengan kata lain sama seperti cookie dalam web browser.

Sebelum lebih jauh sebagai pengantar mari kita bahas beberapa hal yang perlu kita fahami dan siapkan untuk membuat Login System dengan Verifikasi Email ini.

  1. API (Application Programming Interface)
    Untuk berinteraksi dengan MySQL maka pertama kali kita perlu membangun API. API ini yang menjadi perantara antara aplikasi android atau client dengan MySQL. API bertugas untuk menanggapi request dari client, berinteraksi dengan database, dan pada akhirnya memberikanrespon balik pada client (dengan JSON format). Jadi yang pertama kita lakukan adalah membuat API sederhana dan database dan tabel di MySQL.
  2. Download dan Install XAMPP
    Download dan install XAMPP server dari https://www.apachefriends.org/download.html. Setelah terinstal jalankan XAMPP melalui Start > All Programs > XAMPP > XAMPP Control Panel. Maka akan muncul jendela dibawah ini. Klik Start module Apache dan MySQL.Setelah itu cek phpmyadmin dengan membuka http://localhost/phpmyadmin.
  3. Membuat Database dan Tabel dalam MySQL
    Setelah terbuka phpmyadmin sebagai interface dari database server MySQL selanjutnya buat database dan tabel yang kita butuhkan untuk menyimpan data users. Dalam kasus ini kita hanya akan menggunakan 1 database android_login dan 1 tabel users untuk menyimpan informasi login pengguna.
  4. Membuat file PHP yang bertugas sebagai API
    Silahkan menuju ke folder htdocs dimana XAMPP terinstall. Secara default lokasi dari XAMPP adalah di C:\xampp\htdocs. Berikut ini hasil akhir struktur dari fle-file PHP yang akan kita buat dalam tutorial ini.
  • Buat folder android_login dalam folder htdocs. Ini akan menjadi root direktori dari project ini.
  • Selanjutnya dalam fodler android_login buat file php dengan nama config.php dan berikut ini sintaks php-nya.

[php]
<?php $username = "root"; //isi sesuai username MySQL Database kamu $password = ""; //isi sesuai password MySQL Database kamu $host = "localhost"; $dbname = "android_login"; $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => ‘SET NAMES utf8’);
try {
$db = new PDO("mysql:host={$host};dbname={$dbname};
charset=utf8", $username, $password, $options);
} catch(PDOException $ex) {
die("Failed to connect to the database: " . $ex->getMessage());
}
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
if(function_exists(‘get_magic_quotes_gpc’) && get_magic_quotes_gpc()) {
function undo_magic_quotes_gpc(&$array) {
foreach($array as &$value) {
if(is_array($value)) {
undo_magic_quotes_gpc($value);
}
else {
$value = stripslashes($value);
}
}
}
undo_magic_quotes_gpc($_POST);
undo_magic_quotes_gpc($_GET);
undo_magic_quotes_gpc($_COOKIE);
[/php]

  • Sekarang kita buat file php sebagai API untuk menangani resgistrasi user. Dengan file php ini akan menerima nama, email dan password sebagai parameters yang dikirim dengan metode POST dan menyimpan data tersebut dalam tabel users. Dalam root direktori android_login buat register.php dengan sintaks berikut.

[php]
<?php require("config.php"); if (!empty($_POST)) { $response = array("error" => FALSE);
$query = " SELECT 1 FROM users WHERE email = :email";
//now lets update what :user should be
$query_params = array(‘:email’ => $_POST[’email’]);
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["error"] = TRUE;
$response["message"] = "Database Error !. Coba lagi!";
die(json_encode($response));
}
$row = $stmt->fetch();
if ($row) {
$response["error"] = TRUE;
$response["message"] = "Mohon maaf, email sudah terdaftar !";
die(json_encode($response));
} else {
$query = "INSERT INTO users ( unique_id, name, email, encrypted_password, otp,
created_at ) VALUES ( :uuid, :name, :email, :encrypted_password, :otp, NOW() )";
$otp = rand(100000, 999999);
$verified = 0;
$query_params = array(
‘:uuid’ => uniqid(”, true),
‘:name’ => $_POST[‘name’],
‘:email’ => $_POST[’email’],
‘:encrypted_password’ => password_hash($_POST[‘password’], PASSWORD_DEFAULT),
‘:otp’ => $otp
);
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["error"] = TRUE;
$response["message"] = "Database Error!. Coba lagi!";
die(json_encode($response));
}
$name = $_POST[‘name’];
$email = $_POST[’email’];
$subject = "TipsKoding verifikasi email";
$message = "Halo $name,\n\nVerifikasi bahwa email $email milik kamu.
\n\nGunakan kode ini:\n\n$otp\n\nHormat Kami,\nTipsKoding.com.";
$from = "admin@tipskoding.com";
$headers = "From:" . $from;
mail($email,$subject,$message,$headers);
$response["error"] = FALSE;
$response["message"] = "Registrasi Berhasil";
echo json_encode($response);
}
}
else {
echo "TipsKoding.com";
}
?>

[/php]

  • File php dengan nama verification.php untuk verifikasi email, berikut sintaks-nya.

[php]
<?php require("config.php"); if (isset($_POST[‘tag’]) && $_POST[‘tag’] != ”) { $tag = $_POST[‘tag’]; $response = array("tag" => $tag, "error" => FALSE);
$query = "SELECT * FROM users WHERE email = :email";
$query_params = array(‘:email’ => $_POST[’email’]);
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["error"] = true;
$response["message"] = "Database Error !. Coba lagi!";
die(json_encode($response));
}
$otp_ok = false;
$success = false;
$email = $_POST[’email’];
$statusY = 1;
$row = $stmt->fetch();
// Forgot Password
if ($tag == ‘verify_code’) {
if ($row) {
if ($_POST[‘otp’] === $row[‘otp’]) {
$otp_ok = true;
$stmt = $db->prepare("UPDATE users SET verified = :status WHERE email = :email");
$stmt->bindparam(":status", $statusY);
$stmt->bindparam(":email", $email);
$stmt->execute();
}
}
$query = "SELECT * FROM users WHERE email = :email";
$query_params = array(
‘:email’ => $_POST[’email’]
);
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["error"] = true;
$response["message"] = "Database Error!. Coba lagi!";
die(json_encode($response));
}
$user = $stmt->fetch();
if ($otp_ok == true) {
$response["error"] = false;
$response["message"] = "Verifikasi sukses !";
$response["user"]["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["verified"] = $user["verified"];
$response["user"]["created_at"] = $user["created_at"];
die(json_encode($response));
} else {
$response["error"] = true;
$response["message"] = "Email tidak valid!";
die(json_encode($response));
}
}
// Change Password
else if ($tag == ‘resend_code’) {
$otp = rand(100000, 999999);
if ($row) {
$stmt = $db->prepare("UPDATE users SET otp = :otp WHERE email = :email");
$stmt->bindparam(":otp", $otp);
$stmt->bindparam(":email",$email);
$stmt->execute();
$success = true;
}
if ($success == true) {
$name = $row[‘name’];
$email = $_POST[’email’];
$subject = "TipsKoding verifikasi email";
$message = "Halo $name,\n\nVerifikasi bahwa email $email milik kamu.\n\nGunakan kode ini:\n\n$otp\n\nHormat Kami,\nTipsKoding.com.";
$from = "admin@tipskoding.com";
$headers = "From:" . $from;
mail($email,$subject,$message,$headers);
$response["error"] = false;
$response["message"] = "Kode OTP telah dikirim ke email kamu.";
$response["mail"] = $message;
die(json_encode($response));
}
}
[/php]

  • Selanjutnya buat file php dengan nama reset-password.php untuk menangani reset password via email, sintaksnya sebagai berikut.

[php]
<?php require("config.php"); if (isset($_POST[‘tag’]) && $_POST[‘tag’] != ”) { $tag = $_POST[‘tag’]; $response = array("tag" => $tag, "error" => FALSE);
$query = "SELECT * FROM users WHERE email = :email";
$query_params = array(
‘:email’ => $_POST[’email’]
);
try {
$stmt = $db->prepare($query);
$result = $stmt->execute($query_params);
}
catch (PDOException $ex) {
$response["error"] = true;
$response["message"] = "Database Error !. Coba lagi!";
die(json_encode($response));
}
$success = false;
$row = $stmt->fetch();
$email = $_POST[’email’];
// Forgot Password
if ($tag == ‘forgot_pass’) {
$pass = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 6);// Generate new password
$newPassword = password_hash($pass, PASSWORD_DEFAULT); // Encrypted Password
if ($row) {
$stmt = $db->prepare("UPDATE users SET encrypted_password = :newPass WHERE email = :email");
$stmt->bindparam(":newPass", $newPassword);
$stmt->bindparam(":email",$email);
$stmt->execute();
$success = true;
}
if ($success == true) {
$name = $row[‘name’];
$subject = "Permintaan Password Baru";
$message = "Halo $name.\n\nKami menerima permintaan untuk merubah password kamu di TipsKoding.com\n\nPassword baru kamu:\n\n $pass\n\nHormat Kami,\nTipsKoding.";
$from = "admin@tipskoding.com";
$headers = "From:" . $from;
mail($email,$subject,$message,$headers);
$response["error"] = false;
$response["message"] = "Sebuah passwrod baru sudah dikirim ke email kamu.";
$response["mail"] = $message;
die(json_encode($response));
} else {
$response["error"] = true;
$response["message"] = "Email tidak terdaftar!";
die(json_encode($response));
}
}
// Change Password
else if ($tag == ‘change_pass’) {
$oldPassword = $_POST[‘old_password’];
$newPassword = password_hash($_POST[‘password’], PASSWORD_DEFAULT);
if ($row) {
if (password_verify($oldPassword, $row[‘encrypted_password’])) {
$stmt = $db->prepare("UPDATE users SET encrypted_password = :password WHERE email = :email");
$stmt->bindparam(":password", $newPassword);
$stmt->bindparam(":email",$email);
$stmt->execute();
$success = true;
}
}
if ($success == true) {
$response["error"] = false;
$response["message"] = "Password kamu telah berhasil dirubah!.";
die(json_encode($response));
} else {
$response["error"] = true;
$response["message"] = "Password gagal diperbaharui!";
die(json_encode($response));
}
}
} else {
echo "TipsKoding.com";
}
?>
[/php]

Langkah selanjutnya

Join Komunitas TipsKoding.com

Facebook Comments

POST A COMMENT.