keyri-pod 4.6.1

keyri-pod 4.6.1

Artem TkachukAditya MalladiAndrewKuliahin96 维护。



keyri-pod 4.6.1

  • AndrewKuliahin96

Keyri iOS SDK 的最新源代码可在此处找到:https://github.com/Keyri-Co/keyri-ios-whitelabel-sdk/releases

系统需求

  • iOS 14+

  • Swift 5+

  • Apple A7 芯片或更高版本(iPhone 5s 中使用的 A7 芯片)

目录

  • 集成
  • 二维码登录
  • 设备指纹识别
  • 与 API 交互
  • 会话对象

集成

****CocoaPods 是 Cocoa 项目的依赖关系管理器。有关用法和安装说明,请访问他们的网站。要使用 CocoaPods 将 Keyri iOS SDK 集成到您的 Xcode 项目中,在您的 Podfile 中指定它

pod 'keyri-pod'

然后可以将 SDK 以以下方式导入任何 Swift 文件

import keyri-pod

二维码登录 - 通用链接

要处理通用链接(例如,从用户的内置相机应用中直接进行二维码登录),您需要在您的 App.entitlements 中添加关联域名权限。要在您的应用程序中设置权限,请打开 Xcode 中目标的签名和功能选项卡并添加关联域名功能,或者如果您已有权限,您可以修改您的 App.entitlements 文件以匹配此示例。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.developer.associated-domains</key>
	<array>
		<string>applinks:{domainName}</string>
	</array>
</dict>
</plist>

这将为以下方案的链接进行处理:https://{您的公司}.onekey.to?sessionId={sessionId}

注意:Keyri 会在您在 控制台 中配置后自动创建您的 https://{您的子域名}.onekey.to 页面。

在声明链接处理的 AppDelegate 中,您需要在 application(_:continue:restorationHandler:) 方法中添加处理程序。

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
        let incomingURL = userActivity.webpageURL
    else {
        return false
    }
    
    process(url: incomingURL)
    
    return true
}

func process(url: URL) {
    let sessionId = URLComponents(url: url, resolvingAgainstBaseURL: true)?.queryItems?.first(where: { $0.name == "sessionId" })?.value ?? ""
    let payload = "Custom payload here"
    let appKey = selectedAppKey // Get this value from the Keyri Developer Portal

    let keyri = Keyri() // Be sure to import the SDK at the top of the file
    let res = keyri.initializeQrSession(username: "lol", sessionId: sessionId, appKey: appKey) { result in
        switch result {
        case .success(let session):
            DispatchQueue.main.async {
                session.payload = payload
                keyri.initializeDefaultScreen(sessionId: session.sessionId) { bool in
                    print(bool)
                }
            }
        case .failure(let error):
            print(error.localizedDescription)
        }
        
    }

注意:Keyri 将根据苹果的要求在您的 https://{您的子域名}.onekey.to 页面上设置所需的 /.well-known/apple-app-site-association JSON,以处理通用链接处理。有关此机制的详细信息,请参见此处:https://developer.apple.com/documentation/Xcode/supporting-associated-domains

二维码登录 - 应用内扫描仪

这可以与通用链接一起使用或单独使用。

Keyri SDK 包括一个默认的扫描仪视图,可以像下面这样调用和显示。由于平台限制,我们目前必须将其保留在 UIKit 中,但随着时间的推移,我们会寻找将其转换为 SwiftUI 的选项。完成块这里是重要的部分:我们返回显示在二维码中的确切字符串。您只需要将其转换为 URL,然后您可以像上面一样处理响应(请注意,两个情况中的 process(url) 函数都是一样的)。

ptfunc handleDisplayingScanner() {
    let scanner = Scanner()
    scanner.completion = { str in 
        guard let url = URL(string: str) else { return nil }
        process(url)
    }

    scanner.show()
}

func process(url: URL) {
    let sessionId = URLComponents(url: url, resolvingAgainstBaseURL: true)?
    .queryItems?.first(where: { $0.name == "sessionId" })?.value ?? ""
    let payload = "Custom payload here"
    let appKey = "App key here" // Get this value from the Keyri Developer Portal

    let keyri = Keyri() // Be sure to import the SDK at the top of the file
    let res = keyri.initializeQrSession(appKey: appKey, sessionId: sessionId, payload: payload)

    switch res {
    case .success(let session):
        // You can optionally create a custom screen and pass the session ID there. We recommend this approach for large enterprises
        initializeDefaultScreen(session)

        // In a real world example you’d wait for user confirmation first
        session.confirm() // or session.deny()
    case .failure(let error):
        print(error)
    }
        
    
}

设备指纹识别

Keyri 允许进行设备指纹识别,即使在应用被删除并重新安装的情况下也能持续。下面是一个如何利用这一功能的简单示例,在这种情况下,限制每个设备只能有1个用户

Swift 代码

func registerUser(username: String) throws {
	if let list = Keyri().listUniqueAccounts() {
		if let existingUsername = list.keys.first {
		    // Alert user that there is an existing user, and encourage them to sign in here
		}

	} else {
		let key = try Keyri().generateAssociationKey(username: username)
		// Then run your regular registration process
		// Optionally, do something else with the key that was just generated
		// Keyri handles saving the key in the Secure Enclave for you
		// For example, you can later use this key pair to passwordlessly authenticate the user
	}
}

与API交互

以下方法可用于与Keyri SDK API交互,可以用来构建自定义流程并以不同方式利用SDK

  • func initiateQrSession(sessionId: String, appKey: String): Result<Session, Error> - 在从二维码或深度链接获取sessionId后调用。返回包含风险属性(需要显示确认屏幕)的Session对象或异常。

  • func initializeDefaultConfirmationScreen(session: Session): Boolean - 用于显示默认UI的确认对话框。您还可以实现自定义确认屏幕。默认屏幕使用SwiftUI构建,但会话对象也设计成能够与UIKit无缝工作,如果您希望这样做

  • func Session.confirm(publicUserId: String?, payload: String):Result<Bool, Error> - 如果用户确认对话框,请调用此函数。返回身份验证结果。

  • func Session.deny(publicUserId: String?, payload: String): Result<Bool, Error> - 如果用户拒绝对话框,请调用此函数。返回身份验证结果。

  • func generateAssociationKey(publicUserId: String): String - 为给定的公开用户ID(例如电子邮件地址)创建持久化的ECDSA密钥对并返回公钥。

  • func getUserSignature(publicUserId: String?, customSignedData: String?): String - 返回带有publicUserId的私有密钥(如果没有提供,则为匿名私有密钥)对时间戳和可选的customSignedData的ECDSA签名。

  • func getAssociationKey(publicUserId: String): String - 返回指定publicUserId的Base64公钥。

  • func removeAssociationKey(publicUserId: String) - 删除指定用户的密钥,删除其记录

  • func listAssociationKeys(): [String: String] - 返回一个用户名到关联密钥的映射,设备上的每个这样的密钥

func listUniqueAccounts(): [String: String] - 返回一个用户名到关联密钥的映射,设备上的每个这样的密钥,但与上面的匿名账户不同

payload可以是任何内容(会话令牌或包含多个项的字符串化JSON。可以包含诸如publicUserId、时间戳、customSignedData和ECDSA签名等项)。

Session 对象

Session 对象在调用 initializeQrSession 成功时返回,用于向最终用户展示情况并获取其确认以完成认证。以下是可触发的一些关键属性和方法。如果您正在使用内置视图,则只需调用上述 confirm/deny 方法

  • IPAddressMobile/Widget - 移动设备和网页浏览器的 IP 地址

  • WidgetUserAgent - 浏览器用户代理(例如,macOS 上的 Chrome)

  • RiskAnalytics - 如果您的订阅计划支持

    • RiskStatus - 清除、警告或拒绝

    • RiskFlagString - 如果 RiskStatus 为警告或拒绝,此字符串将通知用户启动风险情况的原因

    • GeoData - 移动设备和组件的位置数据

      • Mobile

        • 城市

        • 国家代码

      • Browser

        • 城市

        • 国家代码

  • Session.confirm() 和 Session.deny() - 请参阅 与 API 交互 中的说明

许可

此库可在付费和免费许可下使用。请参阅 LICENSE 文件以获取完整的许可文本。

详细信息

许可下允许的内容

  • 在 Keyri 开发者计划下免费用于任何应用程序。
  • 根据需要在工作应用程序中进行任何修改

许可下不允许的内容

  • 在不同许可下重新分发
  • 删除归属信息
  • 修改徽标
  • 赔偿:使用此免费软件“自担风险”,因此您不能因此库引起的问题起诉 Keyri, Inc.

免责声明

我们非常关心产品质量,并严格测试了我们提供的每一项功能。然而,每个集成都是不同的。App Store中的每个应用程序都有不同的构建设置、编译器标志、处理器要求、兼容性问题等变体,我们不可能涵盖所有这些方面,因此我们强烈建议在产品上线前对您的集成进行彻底测试。如果您在GitHub上发现任何似乎不正确或奇怪的问题,请随时提交错误或问题。

https://github.com/Keyri-Co/keyri-ios-whitelabel-sdk/issues