使用 Flutter + Appwrite 进行魔法 URL 身份验证
Appwrite 0.10 引入了Magic URL,这是一种无需密码的身份验证方法。它允许开发人员使用电子邮件和通过电子邮件发送的 URL 来验证用户身份。
⚙️ 设置
在本教程中,我们将学习如何使用 Appwrite 的Flutter SDK在 Flutter 应用程序中使用魔法 URL 身份验证。我们的Web SDK和Android SDK也可以实现同样的功能。由于此功能需要发送电子邮件,因此您必须在 Appwrite 中正确设置 SMTP 服务。如果您还没有设置,可以按照本指南在您的 Appwrite 服务器中设置 SMTP。
首先,将 Flutter SDK 添加到我们的 Flutter 项目中。在终端中,在项目目录中输入以下命令来添加 SDK
flutter pub add appwrite
接下来,使用您的项目 ID 导入并初始化 SDK,该 ID 可以在 Appwrite 控制台的项目设置页面中找到:
import 'package:appwrite/appwrite.dart';
final client = new Client();
client
.setEndpoint('http://localhost/v1') // Your Appwrite Endpoint
.setProject('455x34dfkj') // Your Appwrite Project ID
;
最后,如果您使用的是 Android,请更新AndroidManifest.xml文件,以便在使用魔术 URL 处理登录后处理重定向,如下所示:
<manifest>
<application>
<!-- ... -->
<activity android:name="com.linusu.flutter_web_auth.CallbackActivity" >
<intent-filter android:label="flutter_web_auth">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="appwrite-callback-[PROJECT_ID]" />
</intent-filter>
</activity>
<!-- ... -->
</application>
</manifest>
🎩 创建魔法 URL
SDK 设置完成后,访问Account 服务并调用该createMagicURLSession()
方法。此方法接受电子邮件地址和重定向 URL 作为参数。重定向 URL 是可选的,但如果您想要自行处理魔法 URL 会话的完成和重定向,则必须提供。
// Initiate the Magic URL login
final account = Account(client);
try {
final res = await account.createMagicURLSession(email: 'name@example.com');
print(res.data);
} on AppwriteException catch(e) {
print(e.message);
}
如果该createMagicURLSession()
方法顺利完成且没有错误,请求将向用户发送一封电子邮件,其中包含一个包含下一步密钥的 URL。如果未提供 URL,则使用 Appwrite 实例的 URL,其中有一个内置函数用于处理magic URL session 的完成。当用户点击链接时,他们会被重定向回 URL,其中包含密钥key
以及userId
附加到 URL 查询字符串的值。此链接有效期为 1 小时。如果传递的电子邮件不属于任何现有用户 - 此请求还将为传递的电子邮件地址创建一个用户。
如果您未提供重定向 URL,您的 Appwrite 实例将自动处理完成和重定向,并将您重定向回您的移动应用。为此,请确保您能够从移动设备访问 Appwrite 实例。最好将其托管在具有合适域名的地方。如果没有,请使用ngrok等服务将您的本地主机隧道连接到临时域名。
🔐 使用魔法 URL 登录
如果您确实想自行处理魔法 URL 会话的完成和重定向,则需要构建一个能够处理该过程的 Web 应用。并且,您需要在调用 时将此 Web 应用的 URL 传递到 URL 参数中createMagicURLSession
。
为此,使用该updateMagicURLSession()
方法并使用 URL 查询字符串中的 secret 和 userId 值调用它。
请注意,为了避免重定向攻击,唯一有效的重定向 URL 是您在控制台界面中添加平台时设置的域中的 URL。
const urlParams = new URLSearchParams(window.location.search);
const userId = urlParams.get('userId');
const secret = urlParams.get('secret');
let promise = appwrite.account.updateMagicURLSession(userId, secret);
promise.then(function (response) {
console.log(response); // Success
}, function (error) {
console.log(error); // Failure
});
如果updateMagicURLSession()
成功,则用户现在已登录。
请注意,链接一旦使用,就不能再次使用。
🏁 结论
我们希望您喜欢这项 Appwrite 的新功能,并希望它能为更多应用程序带来实用价值。如果您在使用 Appwrite 设置 Magic URL Login 时需要帮助或遇到任何困难,请加入我们的 Discord。