使用 Flutter 進(jìn)行 Appwrite 電話身份驗證

電話身份驗證是移動應(yīng)用程序最可靠的身份驗證方法之一耽梅。Appwrite 現(xiàn)在在我們最近的版本中引入了電話身份驗證。在本文中诊胞,我們將學(xué)習(xí)如何在我們的 Flutter 應(yīng)用程序中實現(xiàn) Appwrite 的手機(jī)認(rèn)證庸队。

Appwrite 刁卜?

Appwrite是一種開源后端即服務(wù)软瞎,它通過為您的核心后端需求提供一組 REST 和實時 API逢唤,抽象出構(gòu)建現(xiàn)代應(yīng)用程序的所有復(fù)雜性。Appwrite 最大限度地減少了開發(fā)人員的繁重工作涤浇,并處理用戶身份驗證和授權(quán)鳖藕、數(shù)據(jù)庫、文件存儲只锭、云功能吊奢、webhook 等等!

先決條件

  • 訪問 Appwrite 項目或創(chuàng)建項目的權(quán)限。如果您還沒有運(yùn)行 Appwrite 服務(wù)器页滚,請按照官方安裝教程獲取設(shè)置說明。
  • 一個Flutter配置的開發(fā)機(jī)器铺呵。

Twilio 帳戶設(shè)置

我們首先需要設(shè)置一個電話服務(wù)提供商進(jìn)行身份驗證裹驰。Twilio 是一種流行的選擇——Twilio 帳戶可以提供 API 訪問密鑰,允許 Appwrite 將代碼發(fā)送到手機(jī)片挂。如果您沒有現(xiàn)有的 Twilio 帳戶幻林,您可以訪問https://www.twilio.com/try-twilio并使用您的電子郵件和密碼創(chuàng)建一個免費(fèi)帳戶。通過電子郵件音念,您將收到一個驗證鏈接沪饺,單擊該鏈接將驗證您的 Twilio 帳戶。它還會要求您驗證您的電話號碼闷愤。

輸入您的電話號碼整葡,然后單擊“驗證”按鈕。然后讥脐,您將通過 SMS 收到一個代碼遭居。在 Twilio 中輸入收到的代碼,然后單擊提交以確認(rèn)您的號碼旬渠。

在下一個屏幕上俱萍,輸入您的選擇。您選擇哪種編碼語言并不重要告丢,因為我們會將 Twilio 與 Appwrite 集成枪蘑,因此我們不必直接與 Twilio 交互。接下來岖免,單擊開始使用 Twilio按鈕岳颇。

然后,您應(yīng)該被重定向到 Twilio 控制臺觅捆。單擊獲取您的 Twilio 號碼按鈕赦役。初始試用帳戶只能向您已驗證的號碼發(fā)送短信和電話,并且對于測試而言栅炒,這是完美的掂摔。但是,對于生產(chǎn)用途赢赊,您必須升級您的 Twilio 帳戶乙漓。

您可以在控制臺中看到 Account SID、Auth Token 和 Phone number释移。在下一個會話中叭披,您將需要這些將 Twillio 設(shè)置為 Appwrite 可以使用的 SMS 提供程序。您的 Twilio 帳戶現(xiàn)在應(yīng)該已準(zhǔn)備好與 Appwrite 集成玩讳。

應(yīng)用程序設(shè)置

按照官方指南設(shè)置和運(yùn)行 Appwrite涩蜘。為了讓 Appwrite 了解 Appwrite嚼贡,我們需要.env從您安裝 Appwrite 的 appwrite 目錄打開文件,并更新以下環(huán)境變量同诫。

_APP_PHONE_PROVIDER=phone://<ACCOUNT SID>:<AUTH TOKEN>@twilio
_APP_PHONE_FROM=<TWILIO_PHONE_NUMBER>

更新環(huán)境變量后粤策,從包含.envdocker-compose.yml文件的安裝目錄中的命令行運(yùn)行以下命令。

docker-compose up -d

這將重新啟動容器误窖,為環(huán)境變量提供新值叮盘,因此 Appwrite 可以連接到 Twilio。我們現(xiàn)在準(zhǔn)備在我們的應(yīng)用程序中實現(xiàn)電話身份驗證霹俺。

安裝和配置 Appwrite 的 Flutter SDK

克隆我們?yōu)楸窘坛虅?chuàng)建的項目讓我們跳過設(shè)置和 UI 部分柔吼,并專注于主要主題”螅克隆https://github.com/lohanidamodar/appwrite_phone_auth.git愈魏。克隆后艇棕,在您最喜歡的 IDE 中打開它蝌戒。

我們將從添加 Appwrite 的 SDK 作為依賴項開始。打開pubspec.yaml文件沼琉,在依賴項下添加 Appwrite 的 SDK北苟。

dependencies:
    appwrite: ^6.0.0

如果 IDE 沒有自動獲取依賴項,請從終端運(yùn)行以下命令打瘪。

flutter pub get

接下來友鼻,打開lib/providers/app_state.dart文件。這是我們將配置我們的 Appwrite SDK 的地方闺骚。首先彩扔,導(dǎo)入appwrite包。

import 'package:appwrite/appwrite.dart';
import 'package:appwrite/models.dart'; // Response type definitions

在 AuthState 類中僻爽,添加新屬性虫碉。

class AuthState extends ChangeNotifier {
  final _client = Client();
  late final Account  _account;
}

然后在構(gòu)造函數(shù)中,讓我們配置客戶端并實例化帳戶胸梆。

  AuthState() {
    _client.setEndpoint('YOUR_ENDPOINT')
       .setProject(‘YOUR_PROJECT_ID’);
    _account = Account(client);
  }

安裝和配置 SDK 后敦捧,最后一步是將平臺添加到我們的 Appwrite 項目中。打開 Appwrite 控制臺并選擇您為此應(yīng)用程序創(chuàng)建的項目碰镜。您可以在項目主頁上找到添加平臺按鈕兢卵。點擊Add Platform按鈕并選擇New Flutter App。在出現(xiàn)的對話框中绪颖,選擇合適的 Flutter 平臺秽荤,為其指定一個可識別的名稱,并根據(jù)平臺添加應(yīng)用程序 ID 或包名稱。您必須為您在應(yīng)用程序中構(gòu)建的每個 Flutter 平臺完成此步驟窃款。

現(xiàn)在我們的 SDK 已經(jīng)安裝和配置好了课兄,我們準(zhǔn)備在我們的應(yīng)用程序中實現(xiàn)電話身份驗證。

使用電話創(chuàng)建會話

為具有電話號碼的用戶創(chuàng)建有效會話需要兩個步驟雁乡。首先第喳,要啟動會話創(chuàng)建過程,我們將使用設(shè)置提供程序向提供的電話號碼發(fā)送驗證碼踱稍。接下來,驗證碼將確認(rèn)并為用戶創(chuàng)建一個有效的會話悠抹。所以讓我們在我們的AuthState類中實現(xiàn)這兩個方法珠月。

要啟動會話,我們createPhoneSession從帳戶服務(wù)調(diào)用并傳遞userId電話號碼和電話號碼楔敌。傳遞'unique()'asuserId允許 Appwrite 生成唯一的 Id啤挎。

  Future<bool> createSession(String phone) async {
    try {
      final token =
          await _account.createPhoneSession(userId: 'unique()', number: phone);
      userId = token.userId;
      return true;
    } on AppwriteException catch (e) {
      _error = e.message ?? e.toString();
      isLoggedIn = false;
      notifyListeners();
      return false;
    }
  }

調(diào)用createPhoneSession返回一個帶有 的令牌對象userId。我們保存 是userId因為我們需要它來確認(rèn)身份驗證并創(chuàng)建有效會話卵凑。為此庆聘,我們需要updatePhoneSession從帳戶服務(wù)調(diào)用。讓我們按照confirmSession方法勺卢。

Future<bool> confirmSession(String secret) async {
    if (userId.isEmpty) {
      _error = 'userId not known, call `createSession` first to get userId';
      notifyListeners();
      return false;
    }
    try {
      await _account.updatePhoneSession(userId: userId, secret: secret);
      await getAccount();
      return true;
    } on AppwriteException catch (e) {
      _error = e.message ?? e.toString();
      isLoggedIn = false;
      return false;
    }
  }

現(xiàn)在讓我們在適當(dāng)?shù)?UI 中調(diào)用這些方法伙判。打開lib/login.dart并找到登錄按鈕。在按鈕的onPressed動作中黑忱,勾選后添加如下代碼宴抚。

final success = await ref
  .read(AuthState.provider.notifier)
  .createSession(_phoneController.text);
if (!mounted) return;
if (success) {
  Navigator.pushNamed(context, '/verify');
}

打開lib/verify_phone.dart并找到驗證按鈕。在按鈕的onPressed動作中甫煞,勾選后添加如下代碼菇曲。

final loggedIn = await ref
    .read(AuthState.provider.notifier)
    .confirmSession(currentText);
if (!mounted) return;
if (loggedIn) {
  Navigator.pushReplacementNamed(context, '/');
} else {
  ScaffoldMessenger.of(context).showSnackBar(SnackBar(
    content: Text(ref.read(AuthState.provider).error),
  ));
}

在這里,我們使用 SMS 中收到的代碼調(diào)用 Appwrite抚吠。我們需要做的最后一件事是——我們需要打電話來獲得一個帳戶常潮。打開lib/providers/app_state.dart并添加以下功能。

  Future<bool> getAccount() async {
    try {
      user = await _account.get();
      isLoggedIn = true;
      notifyListeners();
      return true;
    } on AppwriteException catch (e) {
      _error = e.message ?? e.toString();
      isLoggedIn = false;
      user = null;
      notifyListeners();
      return false;
    }
  }

在 的構(gòu)造函數(shù)中調(diào)用這個函數(shù)AuthState楷力,所以當(dāng)應(yīng)用程序啟動時喊式,它會檢查我們是否已經(jīng)有一個有效的會話。您現(xiàn)在可以運(yùn)行應(yīng)用程序并查看手機(jī)身份驗證的實際效果弥雹。

結(jié)論

這就是使用 Appwrite 設(shè)置電話身份驗證是多么容易垃帅。

我整理了一份flutter相關(guān)學(xué)習(xí)文檔,大家如不嫌棄剪勿,可拿去做參考文檔學(xué)習(xí)↓↓↓

有需要的可以復(fù)制下方鏈接贸诚,傳送直達(dá)!!酱固!
https://docs.qq.com/doc/DQkN3SnpnZVdoZkVv
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末械念,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子运悲,更是在濱河造成了極大的恐慌龄减,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件班眯,死亡現(xiàn)場離奇詭異希停,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)署隘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門宠能,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人磁餐,你說我怎么就攤上這事违崇。” “怎么了诊霹?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵羞延,是天一觀的道長。 經(jīng)常有香客問我脾还,道長伴箩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任荠呐,我火速辦了婚禮赛蔫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泥张。我一直安慰自己呵恢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布媚创。 她就那樣靜靜地躺著渗钉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪钞钙。 梳的紋絲不亂的頭發(fā)上鳄橘,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音芒炼,去河邊找鬼瘫怜。 笑死,一個胖子當(dāng)著我的面吹牛本刽,可吹牛的內(nèi)容都是我干的鲸湃。 我是一名探鬼主播赠涮,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暗挑!你這毒婦竟也來了笋除?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炸裆,失蹤者是張志新(化名)和其女友劉穎垃它,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烹看,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡国拇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惯殊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贝奇。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖靠胜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毕源,我是刑警寧澤浪漠,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站霎褐,受9級特大地震影響址愿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冻璃,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一响谓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧省艳,春花似錦娘纷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辐烂,卻和暖如春遏插,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纠修。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工胳嘲, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扣草。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓了牛,卻偏偏與公主長得像颜屠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子白魂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容