iT邦幫忙

2024 iThome 鐵人賽

DAY 20
1
Mobile Development

用最接近自然語言的Basic30天學會行動App系列 第 20

Basic30天學會行動App-第20章.實作使用者認證

  • 分享至 

  • xImage
  •  

第20章: 實作使用者認證

使用者認證是行動應用程式中至關重要的一部分,特別是當應用程式涉及到個人資料和敏感資訊的時候。透過有效的認證機制,我們可以確保只有合法的使用者能夠訪問應用程式的特定功能。本章將介紹如何在 B4A 應用程式中實作使用者註冊與登入、使用 OAuth 和社群登入、以及管理使用者 Session。

使用者註冊與登入

建立一個穩固的使用者註冊與登入系統是任何認證流程的核心。這涉及到資料收集、資料驗證以及安全地存儲使用者憑證。

  1. 使用者註冊
    在註冊流程中,應用程式需要收集使用者的基本資訊,例如電子郵件、密碼等,並將這些資訊存儲在安全的資料庫中。
Sub RegisterUser(email As String, password As String)
    ' 假設使用 AES 加密來保護密碼
    Dim encryptedPassword As String = EncryptData(password, "YourSecretKey")
    Dim sql As SQL
    sql.Initialize(File.DirInternal, "users.db", True)
    sql.ExecNonQuery2("INSERT INTO users (email, password) VALUES (?, ?)", Array As String(email, encryptedPassword))
    ToastMessageShow("註冊成功", False)
End Sub

在這段程式碼中,使用 AES 加密來保護使用者的密碼,並將其存儲在 SQLite 資料庫中。這樣可以確保即使資料庫遭到攻擊,密碼也不會以明文形式洩露。
2. 使用者登入
登入流程需要驗證使用者的電子郵件和密碼是否正確,並允許合法的使用者訪問應用程式。

Sub LoginUser(email As String, password As String) As Boolean
    Dim sql As SQL
    sql.Initialize(File.DirInternal, "users.db", True)
    Dim cursor As Cursor = sql.ExecQuery2("SELECT password FROM users WHERE email = ?", Array As String(email))
    If cursor.RowCount > 0 Then
        cursor.Position = 0
        Dim storedPassword As String = cursor.GetString("password")
        If storedPassword = EncryptData(password, "YourSecretKey") Then
            ToastMessageShow("登入成功", False)
            Return True
        End If
    End If
    ToastMessageShow("登入失敗", False)
    Return False
End Sub

這段程式碼展示了如何驗證使用者的憑證,並確保只有使用者提供的密碼與存儲在資料庫中的加密密碼匹配時,才能成功登入。

使用 OAuth 與社群登入

OAuth 是一種開放標準,用於讓第三方應用程式安全地訪問使用者的資源而不必透露其憑證。透過 OAuth,使用者可以使用現有的社群帳戶(例如 Google 或 Facebook)來登入應用程式,無需再創建新的帳戶。

  1. 設定 OAuth
    在 B4A 中,你可以透過調用 WebView 來啟動 OAuth 流程,並在完成後獲取使用者的授權令牌。
Sub StartOAuthLogin
    Dim oauthURL As String = "https://accounts.google.com/o/oauth2/v2/auth?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=token&scope=email"
    Dim webview As WebView
    webview.Initialize("")
    Activity.AddView(webview, 0, 0, 100%x, 100%y)
    webview.LoadUrl(oauthURL)
End Sub

在這段程式碼中,我們初始化了一個 WebView 並加載了 OAuth 授權頁面。當使用者完成授權後,應用程式會接收到一個包含授權令牌的重定向網址,然後你可以提取並使用該令牌來訪問使用者的資料。
2. 處理 OAuth 回調
當使用者完成授權後,應用程式需要處理 OAuth 回調以獲取授權令牌。

Sub WebView1_OverrideUrl(Url As String) As Boolean
    If Url.StartsWith("YOUR_REDIRECT_URI") Then
        Dim token As String = Url.SubString(Url.IndexOf("access_token=") + 13)
        SaveOAuthToken(token)
        ToastMessageShow("OAuth 登入成功", False)
        Return True
    End If
    Return False
End Sub

Sub SaveOAuthToken(token As String)
    Dim prefs As SharedPreferences
    prefs.Initialize("MyPrefs")
    prefs.PutString("oauth_token", token)
End Sub

這段程式碼中,我們檢查 WebView 的 URL 是否包含授權令牌,並將其存儲在 SharedPreferences 中以供後續使用。
管理使用者 Session
在使用者成功登入後,應用程式需要維持使用者的 Session 狀態,以便在整個使用過程中保留使用者的認證信息。

  1. 使用 SharedPreferences 管理 Session
    使用 SharedPreferences 可以輕鬆管理使用者的登入狀態。當使用者成功登入後,我們可以將 Session 資訊存儲在 SharedPreferences 中。
Sub SaveUserSession(userId As String)
    Dim prefs As SharedPreferences
    prefs.Initialize("MyPrefs")
    prefs.PutString("user_id", userId)
    prefs.PutBoolean("logged_in", True)
End Sub

Sub IsUserLoggedIn As Boolean
    Dim prefs As SharedPreferences
    prefs.Initialize("MyPrefs")
    Return prefs.GetBoolean("logged_in", False)
End Sub

這段程式碼展示了如何存儲和檢查使用者的登入狀態,並在需要時確保應用程式保持使用者的 Session 狀態。
2. 登出處理
為了允許使用者安全地登出,應用程式需要清除 Session 資訊。

Sub LogoutUser
    Dim prefs As SharedPreferences
    prefs.Initialize("MyPrefs")
    prefs.Remove("user_id")
    prefs.PutBoolean("logged_in", False)
    ToastMessageShow("已登出", False)
End Sub

這段程式碼通過清除 SharedPreferences 中的相關資料來實現使用者登出,並顯示登出成功的提示訊息。

範例程式:綜合應用

以下是一個簡單的範例應用程式,結合了使用者註冊、登入、OAuth 登入與 Session 管理的技術。

Sub Process_Globals
    ' 全域變數
End Sub

Sub Globals
    Dim edtEmail As EditText
    Dim edtPassword As EditText
    Dim btnRegister As Button
    Dim btnLogin As Button
    Dim btnOAuthLogin As Button
    Dim lblStatus As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("MainLayout")
    
    edtEmail.Initialize("edtEmail")
    Activity.AddView(edtEmail, 10, 10, 300, 50)
    
    edtPassword.Initialize("edtPassword")
    Activity.AddView(edtPassword, 10, 70, 300, 50)
    
    btnRegister.Initialize("btnRegister")
    btnRegister.Text = "註冊"
    Activity.AddView(btnRegister, 10, 130, 100, 50)
    
    btnLogin.Initialize("btnLogin")
    btnLogin.Text = "登入"
    Activity.AddView(btnLogin, 120, 130, 100, 50)
    
    btnOAuthLogin.Initialize("btnOAuthLogin")
    btnOAuthLogin.Text = "使用 OAuth 登入"
    Activity.AddView(btnOAuthLogin, 230, 130, 200, 50)
    
    lblStatus.Initialize("")
    Activity.AddView(lblStatus, 10, 190, 300, 50)
    
    If IsUserLoggedIn Then
        lblStatus.Text = "使用者已登入"
    End If
End Sub

Sub btnRegister_Click
    RegisterUser(edtEmail.Text, edtPassword.Text)
End Sub

Sub btnLogin_Click
    If LoginUser(edtEmail.Text, edtPassword.Text) Then
        SaveUserSession(edtEmail.Text)
        lblStatus.Text = "登入成功"
    Else
        lblStatus.Text = "登入失敗"
    End Sub
End Sub

Sub btnOAuthLogin_Click
    StartOAuthLogin
End Sub

結論
本章介紹了如何在 B4A 應用程式中實作使用者認證功能,從基本的註冊與登入,到使用 OAuth 進行社群登入,再到管理使用者 Session。透過這些技術,你可以為應用程式建立一個強大且安全的認證系統,確保只有合法的使用者能夠訪問應用程式的敏感資料和功能。隨著這些技術的應用,你的應用程式將能夠為使用者提供更好的安全性與使用體驗。

參考網址
https://www.b4x.com/


上一篇
Basic30天學會行動App-第19章.安全性與資料保護
下一篇
Basic30天學會行動App-第21章.App性能優化
系列文
用最接近自然語言的Basic30天學會行動App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言