Logto 是一个为现代应用和 SaaS 产品设计的 Auth0 替代方案。它提供 Cloud 和 开源 服务,帮助你快速启动身份和管理 (IAM) 系统。享受认证 (Authentication)、授权 (Authorization) 和多租户管理 一体化。
我们建议从 Logto Cloud 上的免费开发租户开始。这可以让你轻松探索所有功能。
在本文中,我们将介绍使用 iOS (Swift) 和 Logto 快速构建 OIDC 登录体验(用户认证 (Authentication))的步骤。
先决条件
- 一个正在运行的 Logto 实例。查看 介绍页面 以开始。
- iOS (Swift) 的基本知识。
- 一个可用的 OIDC 账户。
在 Logto 中创建一个应用程序
Logto 基于 OpenID Connect (OIDC) 认证 (Authentication) 和 OAuth 2.0 授权 (Authorization)。它支持跨多个应用程序的联合身份管理,通常称为单点登录 (SSO)。
要创建你的 Native app 应用程序,只需按照以下步骤操作:
- 打开 Logto Console。在“开始使用”部分,点击“查看全部”链接以打开应用程序框架列表。或者,你可以导航到 Logto Console > Applications,然后点击“创建应用程序”按钮。
- 在打开的模态窗口中,点击“Native app”部分,或使用左侧的快速过滤复选框过滤所有可用的“Native app”框架。点击 "iOS (Swift)" 框架卡片以开始创建你的应用程序。
- 输入应用程序名称,例如“Bookstore”,然后点击“创建应用程序”。
🎉 太棒了!你刚刚在 Logto 中创建了你的第一个应用程序。你将看到一个祝贺页面,其中包含详细的集成指南。按照指南查看你的应用程序中的体验将会是什么样的。
集成 iOS (Swift) SDK
添加 Logto SDK 作为依赖
使用以下 URL 将 Logto SDK 添加为 Swift Package Manager 中的依赖项。
https://github.com/logto-io/swift.git
自 Xcode 11 起,你可以 直接导入 Swift 包,无需任何额外工具。
由于一些技术问题,我们目前不支持 Carthage 和 CocoaPods。
Carthage
Carthage 需要一个 xcodeproj
文件来构建,但是 swift package generate-xcodeproj
会报告失败,因为我们使用了本机社交插件的二进制目标。我们会尝试寻找解决方法。
初始化 LogtoClient
通过使用 LogtoConfig
对象创建一个 LogtoClient
实例来初始化客户端。
import Logto
import LogtoClient
let config = try? LogtoConfig(
endpoint: "<your-logto-endpoint>", // 例如 http://localhost:3001
appId: "<your-app-id>"
)
let client = LogtoClient(useConfig: config)
默认情况下,我们将 ID 令牌 (ID Token) 和刷新令牌 (Refresh Token) 等凭据存储在 Keychain 中。因此,当用户返回时,不需要再次登录。
要关闭此行为,请将 usingPersistStorage
设置为 false
:
let config = try? LogtoConfig(
// ...
usingPersistStorage: false
)
登录
在我们深入细节之前,这里是终端用户体验的快速概述。登录过程可以简化如下:
- 你的应用调用登录方法。
- 用户被重定向到 Logto 登录页面。对于原生应用,将打开系统浏览器。
- 用户登录并被重定向回你的应用(配置为重定向 URI)。
关于基于重定向的登录
- 此认证 (Authentication) 过程遵循 OpenID Connect (OIDC) 协议,Logto 强制执行严格的安全措施以保护用户登录。
- 如果你有多个应用程序,可以使用相同的身份提供商 (IdP)(日志 (Logto))。一旦用户登录到一个应用程序,当用户访问另一个应用程序时,Logto 将自动完成登录过程。
要了解有关基于重定向的登录的原理和好处的更多信息,请参阅 Logto 登录体验解释。
配置重定向 URI
让我们切换到 Logto Console 的应用详情页面。添加一个重定向 URI io.logto://callback
并点击“保存更改”。
iOS SDK 中的重定向 URI 仅供内部使用。不需要 添加 自定义 URL 方案 ,除非连接器要求。
登录和登出
在调用 .signInWithBrowser(redirectUri:)
之前,请确保你已在管理控制台中正确配置了重定向 URI。
你可以使用 client.signInWithBrowser(redirectUri:)
来让用户登录,并使用 client.signOut()
来让用户登出。
例如,在 SwiftUI 应用中:
struct ContentView: View {
@State var isAuthenticated: Bool
init() {
isAuthenticated = client.isAuthenticated
}
var body: some View {
VStack {
if isAuthenticated {
Button("Sign Out") {
Task { [self] in
await client.signOut()
isAuthenticated = false
}
}
} else {
Button("Sign In") {
Task { [self] in
do {
try await client.signInWithBrowser(redirectUri: "${
props.redirectUris[0] ?? 'io.logto://callback'
}")
isAuthenticated = true
} catch let error as LogtoClientErrors.SignIn {
// error occured during sign in
} catch {
// other errors
}
}
}
}
}
}
}
检查点:测试你的应用程序
现在,你可以测试你的应用程序:
- 运行你的应用程序,你将看到登录按钮。
- 点击登录按钮,SDK 将初始化登录过程并将你重定向到 Logto 登录页面。
- 登录后,你将被重定向回你的应用程序,并看到登出按钮。
- 点击登出按钮以清除令牌存储并登出。
添加 OIDC 连接器
要实现快速登录并提高用户转化率,请将 iOS (Swift) 作为身份提供商 (IdP) 进行连接。Logto 社交连接器可以帮助你在几分钟内通过允许输入多个参数来建立此连接。
要添加社交连接器,只需按照以下步骤操作:
- 导航到 Console > Connectors > Social Connectors。
- 点击“添加社交连接器”并选择“OIDC”。
- 按照 README 指南完成必填字段并自定义设置。
如果你正在按照现场连接器指南进行操作,可以跳过下一部分。
设置 标准 OIDC 应用
创建你的 OIDC 应用
当你打开此页面时,我们相信你已经知道要连接哪个社交身份提供商。首先要做的是确认身份提供商支持 OIDC 协议,这是配置有效连接器的前提。然后,按照身份提供商的说明注册并创建用于 OIDC 授权的相关应用。
配置你的连接器
出于安全考虑,我们仅支持“Authorization Code”授权类型,它可以完美适应 Logto 的场景。
clientId
和 clientSecret
可以在你的 OIDC 应用详情页面找到。
clientId:客户端 ID 是一个唯一标识符,用于在注册时识别客户端应用程序。授权服务器使用此 ID 验证客户端应用程序的身份,并将任何授权的访问令牌与该特定客户端应用程序关联。
clientSecret:客户端密钥是在注册时由授权服务器发放给客户端应用程序的机密密钥。客户端应用程序使用此密钥在请求访问令牌时向授权服务器进行身份验证。客户端密钥被视为机密信息,应始终保持安全。
tokenEndpointAuthMethod:令牌端点认证方法用于客户端应用程序在请求访问令牌时向授权服务器进行身份验证。要发现支持的方法,请查阅 OAuth 2.0 服务提供商的 OpenID Connect 发现端点中的 token_endpoint_auth_methods_supported
字段,或参考 OAuth 2.0 服务提供商提供的相关文档。
clientSecretJwtSigningAlgorithm (可选):仅在 tokenEndpointAuthMethod
为 client_secret_jwt
时需要。客户端密钥 JWT 签名算法用于客户端应用程序在令牌请求期间向授权服务器发送的 JWT 签名。
scope:权限参数用于指定客户端应用程序请求访问的资源和权限集。权限参数通常定义为一个以空格分隔的值列表,代表特定权限。例如,权限值“read write”可能表示客户端应用程序请求对用户数据的读写访问。
你需要找到 authorizationEndpoint
、tokenEndpoint
、jwksUri
和 issuer
作为 OpenID 提供商的配置信息。它们应该在社交供应商的文档中可用。
authenticationEndpoint:此端点用于启动认证 (Authentication) 过程。认证 (Authentication) 过程通常涉及用户登录并授权客户端应用程序访问其资源。
tokenEndpoint:此端点由客户端应用程序用于获取可以访问请求资源的 ID 令牌。客户端应用程序通常向令牌端点发送带有授权类型和授权代码的请求以接收 ID 令牌。
jwksUri:这是可以获取社交身份提供商(简称 IdP)的 JSON Web Key Set (JWKS) 的 URL 端点。JWKS 是一组加密密钥,IdP 用于签署和验证在认证 (Authentication) 过程中发放的 JSON Web Tokens (JWTs)。jwksUri
由依赖方 (RP) 用于获取 IdP 用于签署 JWT 的公钥,以便 RP 可以验证从 IdP 接收到的 JWT 的真实性和完整性。
issuer:这是 IdP 的唯一标识符,RP 用于验证从 IdP 接收到的 JWT。它包含在 JWT 中作为 iss
声明(ID 令牌始终是 JWT)。发行者值应与 IdP 的授权服务器的 URL 匹配,并且应为 RP 信任的 URI。当 RP 接收到 JWT 时,它会检查 iss
声明以确保它是由受信任的 IdP 发放的,并且 JWT 是用于与 RP 一起使用的。
jwksUri
和 issuer
一起为 RP 在认证 (Authentication) 过程中验证终端用户的身份提供了安全机制。通过使用从 jwksUri
获取的公钥,RP 可以验证 IdP 发放的 JWT 的真实性和完整性。发行者值确保 RP 仅接受由受信任的 IdP 发放的 JWT,并且 JWT 是用于与 RP 一起使用的。
由于始终需要认证 (Authentication) 请求,因此提供了 authRequestOptionalConfig
来包装所有可选配置,你可以在 OIDC 认证 (Authentication) 请求 中找到详细信息。你可能还会发现此配置中缺少 nonce
。由于 nonce
应在每个请求中相同,我们将 nonce
的生成放在代码实现中。所以不用担心!前面提到的 jwksUri
和 issuer
也包含在 idTokenVerificationConfig
中。
你可能会好奇为什么标准 OIDC 协议支持隐式和混合流,而 Logto 连接器仅支持授权流。已确定隐式和混合流不如授权流安全。由于 Logto 专注于安全性,它仅支持授权流,以为其用户提供最高级别的安全性,尽管其便利性略低。
responseType
和 grantType
只能是“Authorization Code”流的固定值,因此我们将它们设为可选,默认值将自动填充。
对于所有流类型,我们提供了一个可选的 customConfig
键来放置你的自定义参数。
每个社交身份提供商可能在 OIDC 标准协议上有自己的变体。如果你所需的社交身份提供商严格遵循 OIDC 标准协议,那么你不需要关心 customConfig
。
配置类型
名称 | 类型 | 必需 |
---|---|---|
scope | string | 是 |
clientId | string | 是 |
clientSecret | string | 是 |
authorizationEndpoint | string | 是 |
tokenEndpoint | string | 是 |
idTokenVerificationConfig | IdTokenVerificationConfig | 是 |
authRequestOptionalConfig | AuthRequestOptionalConfig | 否 |
customConfig | Record<string, string> | 否 |
AuthRequestOptionalConfig 属性 | 类型 | 必需 |
---|---|---|
responseType | string | 否 |
tokenEndpoint | string | 否 |
responseMode | string | 否 |
display | string | 否 |
prompt | string | 否 |
maxAge | string | 否 |
uiLocales | string | 否 |
idTokenHint | string | 否 |
loginHint | string | 否 |
acrValues | string | 否 |
IdTokenVerificationConfig 属性 | 类型 | 必需 |
---|---|---|
jwksUri | string | 是 |
issuer | string | string[] | 否 |
audience | string | string[] | 否 |
algorithms | string[] | 否 |
clockTolerance | string | number | 否 |
crit | Record<string, string | boolean> | 否 |
currentDate | Date | 否 |
maxTokenAge | string | number | 否 |
subject | string | 否 |
typ | string | 否 |
查看 这里 以获取有关 IdTokenVerificationConfig
的更多详细信息。
保存你的配置
仔细检查你是否在 Logto 连接器配置区域填写了必要的值。点击“保存并完成”(或“保存更改”),OIDC 连接器现在应该可用了。
在登录体验中启用 OIDC 连接器
一旦你成功创建了一个社交连接器,你可以在登录体验中将其启用为“继续使用 OIDC”按钮。
- 导航到 Console > 登录体验 > 注册和登录。
- (可选)如果只需要社交登录,选择“无”作为注册标识符。
- 将配置好的 OIDC 连接器添加到“社交登录”部分。
测试和验证
返回到你的 iOS (Swift) 应用。你现在应该可以使用 OIDC 登录了。享受吧!
拓展阅读
终端用户流程:Logto 提供开箱即用的认证 (Authentication) 流程,包括多因素认证 (MFA) 和企业单点登录 (SSO),以及强大的 API,用于灵活实现账户设置、安全验证和多租户体验。
授权 (Authorization):授权 (Authorization) 定义了用户在被认证 (Authentication) 后可以执行的操作或访问的资源。探索如何保护你的 API 以用于原生和单页应用程序,并实现基于角色的访问控制 (RBAC)。
组织 (Organizations):在多租户 SaaS 和 B2B 应用中特别有效,组织功能支持租户创建、成员管理、组织级 RBAC 和即时供应。
客户 IAM 系列:我们关于客户(或消费者)身份和访问管理的系列博客文章,从 101 到高级主题及更深入的内容。