Logto 是一个为现代应用和 SaaS 产品设计的 Auth0 替代方案。它提供 Cloud 和 开源 服务,帮助你快速启动身份和管理 (IAM) 系统。享受认证 (Authentication)、授权 (Authorization) 和多租户管理 一体化。
我们建议从 Logto Cloud 上的免费开发租户开始。这可以让你轻松探索所有功能。
在本文中,我们将介绍使用 Android (Kotlin / Java) 和 Logto 快速构建 SAML enterprise SSO 登录体验(用户认证 (Authentication))的步骤。
先决条件
- 一个正在运行的 Logto 实例。查看 介绍页面 以开始。
- Android (Kotlin / Java) 的基本知识。
- 一个可用的 SAML enterprise SSO 账户。
Create an application in Logto
Logto 基于 OpenID Connect (OIDC) 认证 (Authentication) 和 OAuth 2.0 授权 (Authorization)。它支持跨多个应用程序的联合身份管理,通常称为单点登录 (SSO)。
要创建你的 Native app 应用程序,只需按照以下步骤操作:
- 打开 Logto Console。在“开始使用”部分,点击“查看全部”链接以打开应用程序框架列表。或者,你可以导航到 Logto Console > Applications,然后点击“创建应用程序”按钮。
- 在打开的模态窗口中,点击“Native app”部分,或使用左侧的快速过滤复选框过滤所有可用的“Native app”框架。点击 "Android (Kotlin)" / "Android (Java)" 框架卡片以开始创建你的应用程序。
- 输入应用程序名称,例如“Bookstore”,然后点击“创建应用程序”。
🎉 太棒了!你刚刚在 Logto 中创建了你的第一个应用程序。你将看到一个祝贺页面,其中包含详细的集成指南。按照指南查看你的应用程序中的体验将会是什么样的。
Integrate Android (Kotlin) / Android (Java) SDK
- 示例基于 View system 和 View Model,但在使用 Jetpack Compose 时,概念是相同的。
- 示例是用 Kotlin 编写的,但对于 Java 来说,概念是相同的。
- 我们的 SDK repository 上提供了 Kotlin 和 Java 示例项目。
- 教程视频可以在我们的 YouTube channel 上观看。
安装
Logto Android SDK 支持的最低 Android API 级别是 24。
在安装 Logto Android SDK 之前,确保在 Gradle 项目的构建文件中将 mavenCentral()
添加到你的仓库配置中:
dependencyResolutionManagement {
repositories {
mavenCentral()
}
}
将 Logto Android SDK 添加到你的依赖项中:
- Kotlin
- Groovy
dependencies {
implementation("io.logto.sdk:android:1.1.3")
}
dependencies {
implementation 'io.logto.sdk:android:1.1.3'
}
由于 SDK 需要访问互联网,你需要在 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
:
//...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
:
//...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
并点击“保存更改”。
实现登录和登出
在调用 logtoClient.signIn
之前,请确保你已在管理控制台中正确配置了重定向 URI。
你可以使用 logtoClient.signIn
来让用户登录,并使用 logtoClient.signOut
来让用户登出。
例如,在 Android 应用中:
//...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 中调用 signIn
和 signOut
方法:
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
}
}
}
}
检查点:测试你的应用程序
现在,你可以测试你的应用程序:
- 运行你的应用程序,你将看到登录按钮。
- 点击登录按钮,SDK 将初始化登录过程并将你重定向到 Logto 登录页面。
- 登录后,你将被重定向回你的应用程序,并看到登出按钮。
- 点击登出按钮以清除令牌存储并登出。
Add SAML enterprise SSO connector
To simplify access management and gain enterprise-level safeguards for your big clients, connect with Android (Kotlin) / Android (Java) as a federated identity provider. The Logto enterprise SSO connector helps you establish this connection in minutes by allowing several parameter inputs.
To add an enterprise SSO connector, simply follow these steps:
- Navigate to Logto console > Enterprise SSO.
- Click "Add enterprise connector" button and choose your SSO provider type. Choose from prebuilt connectors for Microsoft Entra ID (Azure AD), Google Workspace, and Okta, or create a custom SSO connection using the standard OpenID Connect (OIDC) or SAML protocol.
- Provide a unique name (e.g., SSO sign-in for Acme Company).
- Configure the connection with your IdP in the "Connection" tab. Check the guides above for each connector types.
- Customize the SSO experience and enterprise’s email domain in the "Experience" tab. Users sign in with the SSO-enabled email domain will be redirected to SSO authentication.
- Save changes.
Set up 在你的 IdP 上配置 SAML SSO 应用程序
步骤 1:在你的身份提供商 (IdP) 上创建一个 SAML 单点登录 (SSO) 应用程序 {#step-1-create-a-saml-sso-application-on-your-idp}
在 IdP 端创建一个应用程序以启动 SAML 单点登录 (SSO) 集成。从 Logto 获取以下配置,代表你的服务提供商 (SP):
- 受众 (Audience) URI (SP 实体 ID):它作为你的 Logto 服务的全局唯一标识符,作为 SP 在向 IdP 发起认证请求时的 EntityId。此标识符对于 IdP 和 Logto 之间安全交换 SAML 断言和其他认证相关数据至关重要。
- ACS URL:断言消费者服务 (ACS) URL 是通过 POST 请求发送 SAML 断言的位置。此 URL 由 IdP 用于将 SAML 断言发送到 Logto。它充当回调 URL,Logto 期望在此接收和消费包含用户身份信息的 SAML 响应。
在你的 IdP SAML 应用程序中填写受众 (Audience) URI 和 ACS URL 配置,并继续从你的 IdP 检索以下配置。
步骤 2:在 Logto 上配置 SAML 单点登录 (SSO)
要使 SAML 单点登录 (SSO) 集成正常工作,你需要向 Logto 提供身份提供商 (IdP) 元数据。身份提供商 (IdP) 元数据是一个 XML 文档,其中包含 Logto 与身份提供商 (IdP) 建立信任所需的所有信息。
导航到 Connection
选项卡。Logto 提供三种不同的方法来配置身份提供商 (IdP) 元数据:
- 元数据 URL:提供身份提供商 (IdP) 元数据 XML 文档的 URL。Logto 将从 URL 获取元数据并自动配置 SAML 单点登录 (SSO) 集成。
- 上传元数据:上传身份提供商 (IdP) 元数据 XML 文档。Logto 将解析 XML 文档并自动配置 SAML 单点登录 (SSO) 集成。
- 手动配置:手动配置身份提供商 (IdP) 元数据。
- 身份提供商 (IdP) 实体 ID:身份提供商 (IdP) 的实体 ID。
- 单点登录 (SSO) URL:身份提供商 (IdP) 单点登录 (SSO) 服务的 URL。
- 签名证书:用于验证来自身份提供商 (IdP) 的 SAML 响应签名的 x509 证书。
通过上述任一配置,Logto 将解析身份提供商 (IdP) 元数据并相应地配置 SAML 单点登录 (SSO) 集成。
步骤 3:配置用户属性映射
从身份提供商 (IdP) 返回的用户属性可能会根据 IdP 的配置而有所不同。Logto 提供了一种灵活的方法,将从 IdP 返回的用户属性映射到 Logto 中的用户属性。你可以在 SAML 单点登录 (SSO) 集成体验选项卡中配置用户属性映射。
- id:用户的唯一标识符。Logto 将从 SAML 响应中读取
nameId
声明作为用户 SSO 身份 id。 - email:用户的电子邮件地址。
- name:用户的姓名。
步骤 4:设置电子邮件域并启用 SSO 连接器
在 Logto 的连接器 SSO 体验
选项卡中提供你组织的 电子邮件域
。这将启用 SSO 连接器作为这些用户的认证 (Authentication) 方法。
在指定域中拥有电子邮件地址的用户将被重定向,使用 SAML SSO 连接器作为他们唯一的认证 (Authentication) 方法。
Save your configuration
仔细检查你是否在 Logto 连接器配置区域填写了必要的值。点击“保存并完成”(或“保存更改”),SAML enterprise SSO 连接器现在应该可用了。
Enable SAML enterprise SSO connector in Sign-in Experience
You don’t need to configure enterprise connectors individually, Logto simplifies SSO integration into your applications with just one click.
- Navigate to: Console > Sign-in experience > Sign-up and sign-in.
- Enable the "Enterprise SSO" toggle.
- Save changes.
Once enabled, a "Single Sign-On" button will appear on your sign-in page. Enterprise users with SSO-enabled email domains can access your services using their enterprise identity providers (IdPs).
To learn more about the SSO user experience, including SP-initiated SSO and IdP-initiated SSO, refer to User flows: Enterprise SSO.
Testing and Validation
返回到你的 Android (Kotlin / Java) 应用。你现在应该可以使用 SAML enterprise SSO 登录了。享受吧!
Further readings
终端用户流程:Logto 提供开箱即用的认证 (Authentication) 流程,包括多因素认证 (MFA) 和企业单点登录 (SSO),以及强大的 API,用于灵活实现账户设置、安全验证和多租户体验。
授权 (Authorization):授权 (Authorization) 定义了用户在被认证 (Authentication) 后可以执行的操作或访问的资源。探索如何保护你的 API 以用于原生和单页应用程序,并实现基于角色的访问控制 (RBAC)。
组织 (Organizations):在多租户 SaaS 和 B2B 应用中特别有效,组织功能支持租户创建、成员管理、组织级 RBAC 和即时供应。
客户 IAM 系列:我们关于客户(或消费者)身份和访问管理的系列博客文章,从 101 到高级主题及更深入的内容。