跳到主要内容
给我们的新朋友:

Logto 是一个为现代应用和 SaaS 产品设计的 Auth0 替代方案。它提供 Cloud开源 服务,帮助你快速启动身份和管理 (IAM) 系统。享受认证 (Authentication)、授权 (Authorization) 和多租户管理 一体化

我们建议从 Logto Cloud 上的免费开发租户开始。这可以让你轻松探索所有功能。

在本文中,我们将介绍使用 Android (Kotlin / Java)Logto 快速构建 Twilio 登录体验(用户认证 (Authentication))的步骤。

先决条件

在 Logto 中创建一个应用程序

Logto 基于 OpenID Connect (OIDC) 认证 (Authentication) 和 OAuth 2.0 授权 (Authorization)。它支持跨多个应用程序的联合身份管理,通常称为单点登录 (SSO)。

要创建你的 Native app 应用程序,只需按照以下步骤操作:

  1. 打开 Logto Console。在“开始使用”部分,点击“查看全部”链接以打开应用程序框架列表。或者,你可以导航到 Logto Console > Applications,然后点击“创建应用程序”按钮。 开始使用
  2. 在打开的模态窗口中,点击“Native app”部分,或使用左侧的快速过滤复选框过滤所有可用的“Native app”框架。点击 "Android (Kotlin)" / "Android (Java)" 框架卡片以开始创建你的应用程序。 框架
  3. 输入应用程序名称,例如“Bookstore”,然后点击“创建应用程序”。

🎉 太棒了!你刚刚在 Logto 中创建了你的第一个应用程序。你将看到一个祝贺页面,其中包含详细的集成指南。按照指南查看你的应用程序中的体验将会是什么样的。

集成 Logto SDK

提示:

安装

备注:

Logto Android SDK 支持的最低 Android API 级别是 24。

在安装 Logto Android SDK 之前,确保在 Gradle 项目的构建文件中将 mavenCentral() 添加到你的仓库配置中:

settings.gradle.kts
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}

将 Logto Android SDK 添加到你的依赖项中:

build.gradle.kts
dependencies {
implementation("io.logto.sdk:android:1.1.3")
}

由于 SDK 需要访问互联网,你需要在 AndroidManifest.xml 文件中添加以下权限:

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<!-- 添加互联网权限 -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- 其他配置... -->
</manifest>

初始化 LogtoClient

创建一个 LogtoViewModel.kt 并在此视图模型中初始化 LogtoClient

LogtoViewModel.kt
//...with other imports
import io.logto.sdk.android.LogtoClient
import io.logto.sdk.android.type.LogtoConfig

class LogtoViewModel(application: Application) : AndroidViewModel(application) {
private val logtoConfig = LogtoConfig(
endpoint = "<your-logto-endpoint>",
appId = "<your-app-id>",
scopes = null,
resources = null,
usingPersistStorage = true,
)

private val logtoClient = LogtoClient(logtoConfig, application)

companion object {
val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(
modelClass: Class<T>,
extras: CreationExtras
): T {
// 从 extras 中获取 Application 对象
val application = checkNotNull(extras[APPLICATION_KEY])
return LogtoViewModel(application) as T
}
}
}
}

然后,为你的 MainActivity.kt 创建一个 LogtoViewModel

MainActivity.kt
//...with other imports
class MainActivity : AppCompatActivity() {
private val logtoViewModel: LogtoViewModel by viewModels { LogtoViewModel.Factory }
//...other codes
}

配置重定向 URI

让我们切换到 Logto Console 的应用详情页面。添加一个重定向 URI io.logto.android://io.logto.sample/callback 并点击“保存更改”。

Logto Console 中的重定向 URI

实现登录和登出

备注:

在调用 logtoClient.signIn 之前,请确保你已在管理控制台中正确配置了重定向 URI。

你可以使用 logtoClient.signIn 来让用户登录,并使用 logtoClient.signOut 来让用户登出。

例如,在 Android 应用中:

LogtoModelView.kt
//...with other imports
class LogtoViewModel(application: Application) : AndroidViewModel(application) {
// ...other codes

// 添加一个 live data 来观察认证状态
private val _authenticated = MutableLiveData(logtoClient.isAuthenticated)
val authenticated: LiveData<Boolean>
get() = _authenticated

fun signIn(context: Activity) {
logtoClient.signIn(context, "io.logto.android://io.logto.sample/callback") { logtoException ->
logtoException?.let { println(it) }
// 更新 live data
_authenticated.postValue(logtoClient.isAuthenticated)
}
}

fun signOut() {
logtoClient.signOut { logtoException ->
logtoException?.let { println(it) }
// 更新 live data
_authenticated.postValue(logtoClient.isAuthenticated)
}
}
}

然后在你的 activity 中调用 signInsignOut 方法:

MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
//...other codes

// 假设你的布局中有一个 id 为 "sign_in_button" 的按钮
val signInButton = findViewById<Button>(R.id.sign_in_button)
signInButton.setOnClickListener {
logtoViewModel.signIn(this)
}

// 假设你的布局中有一个 id 为 "sign_out_button" 的按钮
val signOutButton = findViewById<Button>(R.id.sign_out_button)
signOutButton.setOnClickListener {
if (logtoViewModel.authenticated) { // 检查用户是否已认证
logtoViewModel.signOut()
}
}

// 观察认证状态以更新 UI
logtoViewModel.authenticated.observe(this) { authenticated ->
if (authenticated) {
// 用户已认证
signInButton.visibility = View.GONE
signOutButton.visibility = View.VISIBLE
} else {
// 用户未认证
signInButton.visibility = View.VISIBLE
signOutButton.visibility = View.GONE
}
}

}
}

检查点:测试你的应用程序

现在,你可以测试你的应用程序:

  1. 运行你的应用程序,你将看到登录按钮。
  2. 点击登录按钮,SDK 将初始化登录过程并将你重定向到 Logto 登录页面。
  3. 登录后,你将被重定向回你的应用程序,并看到登出按钮。
  4. 点击登出按钮以清除令牌存储并登出。

添加 Twilio 连接器

SMS 连接器是一种用于发送一次性密码 (OTP) 的方法,用于认证 (Authentication)。它支持 电话号码 验证,以支持无密码认证 (Authentication),包括基于 SMS 的注册、登录、双因素认证 (2FA) 和账户恢复。 你可以轻松地将 Twilio 连接为你的 SMS 提供商。使用 Logto SMS 连接器,你可以在几分钟内完成设置。

要添加 SMS 连接器,只需按照以下步骤操作:

  1. 导航到 Console > Connector > Email and SMS connectors
  2. 要添加新的 SMS 连接器,点击“设置”按钮并选择“Twilio”。
  3. 查看你选择的提供商的 README 文档。
  4. 在“参数配置”部分完成配置字段。
  5. 使用 JSON 编辑器自定义 SMS 模板。
  6. 通过向你的 电话号码 发送验证码来测试你的配置。

Connector tab

备注:

如果你正在按照就地连接器指南进行操作,可以跳过下一部分。

设置 Twilio SMS 连接器

注册 Twilio 账户

Twilio 上创建一个新账户。(如果你已经有一个账户,请跳到下一步。)

设置发送者的电话号码

进入 Twilio 控制台页面并使用你的 Twilio 账户登录。

在“Phone Numbers” -> “Manage” -> “Buy a number”下购买一个电话号码。

提示:

有时你可能会遇到在特定国家或地区不支持短信服务的情况。选择其他地区的号码以绕过此限制。

一旦我们拥有一个有效的号码,导航到“Messaging” -> “Services”。点击按钮创建一个新的消息服务。

给服务起一个友好的名称,并选择 Notify my users 作为我们的服务目的。 在下一步中,选择 Phone Number 作为 Sender Type,并将我们刚刚申请的电话号码添加到此服务中作为发送者。

备注:

每个电话号码只能与一个消息服务关联。

获取账户凭证

我们需要 API 凭证来使连接器工作。让我们从 Twilio 控制台页面开始。

点击右上角的“Account”菜单,然后进入“API keys & tokens”页面以获取你的 Account SIDAuth token

返回侧边栏的“Messaging” -> “Services”设置页面,找到你的服务的 Sid

编写连接器 JSON

用相应消息服务的 Account SIDAuth tokenSid 填写 accountSIDauthTokenfromMessagingServiceSID 字段。

你可以为不同的情况添加多个 SMS 连接器模板。以下是添加单个模板的示例:

  • 用任意字符串类型的内容填写 content 字段。不要忘记为随机验证码保留 {{code}} 占位符。
  • RegisterSignInForgotPasswordGeneric 填写 usageType 字段以适应不同的用例。为了启用完整的用户流程,需要使用 RegisterSignInForgotPasswordGeneric 的模板。

测试 Twilio SMS 连接器

你可以输入一个电话号码并点击“Send”以查看设置是否在“Save and Done”之前有效。

就是这样。不要忘记在 登录体验中启用连接器

配置类型

名称类型
accountSIDstring
authTokenstring
fromMessagingServiceSIDstring
templatesTemplates[]
模板属性类型枚举值
contentstringN/A
usageTypeenum string'Register' | 'SignIn' | 'ForgotPassword' | 'Generic'

保存你的配置

仔细检查你是否在 Logto 连接器配置区域填写了必要的值。点击“保存并完成”(或“保存更改”),Twilio 连接器现在应该可用了。

在登录体验中启用 Twilio 连接器

一旦你成功创建了一个 连接器,你就可以启用基于手机号的无密码登录和注册。

  1. 导航到 Console > 登录体验 > 注册和登录
  2. 设置注册方法(可选):
    1. 选择“电话号码”或“电子邮件或手机号”作为注册标识符。
    2. “注册时验证”被强制启用。你还可以在注册时启用“创建密码”。
  3. 设置登录方法:
    1. 选择 电话号码 作为登录标识符之一。你可以提供多个可用的标识符(电子邮件、手机号和用户名)。
    2. 选择“验证码”和 / 或“密码”作为认证 (Authentication) 因素。
  4. 点击“保存更改”并在“实时预览”中测试。

登录体验选项卡

除了通过 一次性密码进行注册和登录外,你还可以启用密码恢复和基于 的安全验证,以及将 电话号码 关联到个人资料。有关更多详细信息,请参阅 终端用户流程

测试和验证

返回到你的 Android (Kotlin / Java) 应用。你现在应该可以使用 Twilio 登录了。享受吧!

进一步阅读

终端用户流程:Logto 提供开箱即用的认证 (Authentication) 流程,包括多因素认证 (MFA) 和企业单点登录 (SSO),以及强大的 API,用于灵活实现账户设置、安全验证和多租户体验。

授权 (Authorization):授权 (Authorization) 定义了用户在被认证 (Authentication) 后可以执行的操作或访问的资源。探索如何保护你的 API 以用于原生和单页应用程序,并实现基于角色的访问控制 (RBAC)。

组织 (Organizations):在多租户 SaaS 和 B2B 应用中特别有效,组织功能支持租户创建、成员管理、组织级 RBAC 和即时供应。

客户 IAM 系列:我们关于客户(或消费者)身份和访问管理的系列博客文章,从 101 到高级主题及更深入的内容。