EosioSwiftReferenceAuthenticatorSignatureProvider 0.1.1

EosioSwiftReferenceAuthenticatorSignatureProvider 0.1.1

Mark JohnsonPaul KimBrandon Fancher 维护。



  • 作者:
  • Todd Bowden、Serguei Vinnitskii、Farid Rahmani、Brandon Fancher、Steve McCoole 和 Ben Martell

Swift Logo

EOSIO SDK for Swift: Reference iOS Authenticator Signature Provider EOSIO Alpha

Software License Swift 4.2

参考 iOS 认证签名提供者是适用于 EOSIO SDK for Swift 的可插拔签名提供者。使用此签名提供程序和 EOSIO SDK for Swift 的原生 iOS 应用可以与 EOSIO 参考iOS 认证器应用 集成,让用户通过认证器应用登录并批准交易。

应用间通信遵循并由 EOSIO 认证传输协议规范 协助。

所有产品和公司名称都是其各自持有者的商标™ 或注册® 商标。使用它们并不意味着与它们有联系或得到它们的认可。

内容

关于签名提供者

签名提供者抽象可能是所有 EOSIO SDK for Swift 提供者中最有用的。它负责

  • 查找可用于签名的密钥(getAvailableKeys),以及
  • 使用部分可用密钥请求和获取交易签名(signTransaction)。

通过简单地在交易中更换签名提供者,签名请求可以以多种方式路由。需要直接从平台的钥匙串或安全区域内获取签名吗?配置一个符合该功能的签名提供者的 EosioTransaction,例如 EOSIO SDK for Swift: Vault Signature Provider。需要在用户的设备上的钱包获取签名吗?这个签名提供者演示了该功能。

所有签名提供者都必须遵循 EosioSignatureProviderProtocol 协议。

先决条件

  • Xcode 10 或更高版本
  • CocoaPods 1.5.3 或更高版本
  • 对于 iOS,iOS 11 或更高版本

依赖项

参考 iOS 验证器签名提供者依赖于作为依赖项的 EOSIO SDK for Swift 库。当您将参考 iOS 验证器签名提供者包含到应用程序中时,EOSIO SDK for Swift 会自动安装。

参考 iOS 验证器签名提供者还需要用户设备上存在 EOSIO Reference iOS Authenticator App 或其他实现所需接口的验证器,以将选择性披露和签名请求传递。

安装

参考 iOS 验证器签名提供者旨在与 EOSIO SDK for Swift 一起作为提供商插件使用。

要在您的应用程序中与 EOSIO SDK for Swift 一起使用参考 iOS 验证器签名提供者,请向您的 Podfile 添加以下 pod

use_frameworks!

target "Your Target" do
  pod "EosioSwift", "~> 0.1.1" # EOSIO SDK for Swift core library
  pod "EosioSwiftReferenceAuthenticatorSignatureProvider", "~> 0.1.1" # pod for this library
  # add other providers for EOSIO SDK for Swift
  pod "EosioSwiftAbieosSerializationProvider", "~> 0.1.1" # serialization provider
end

现在,根据 EOSIO SDK for Swift 基本使用说明,参考 iOS 验证器签名提供者可以用于 EOSIO SDK for Swift 中。

使用EOSIO SDK的Swift版本

通常,签名提供者会在签名过程中被EosioTransaction调用。(这里有一个通用示例。)。为了在EosioTransaction中具体使用引用iOS身份验证器签名提供者,您可以按照以下示例操作

let from = "testuseraaaa"
let to = "testuserbbbb"
var amount = "10.0000 SYS"
let memo = "Test transfer."

let transaction = EosioTransaction()
transaction.rpcProvider = EosioRpcProvider(endpoint: URL(string: "https://my.blockchain.domain")!)
transaction.serializationProvider = EosioAbieosSerializationProvider()

let eosioAppSignatureProvider = EosioReferenceAuthenticatorSignatureProvider.shared
eosioAppSignatureProvider.returnUrl = "myappurl://"
eosioAppSignatureProvider.declaredDomain = "myapp.domain.com"

// Optional, set security exclusions if testing or debugging
if let theSecurityExclusions = self.securityExclusions {
    eosioAppSignatureProvider.securityExclusions = theSecurityExclusions
}

transaction.signatureProvider = eosioAppSignatureProvider

let action = try! EosioTransaction.Action(
    account: EosioName("eosio.token"),
    name: EosioName("transfer"),
        authorization: [EosioTransaction.Action.Authorization(
        actor: EosioName(from),
        permission: EosioName("active"))
      	 ],
    data: Transfer(
        from: EosioName(from),
        to: EosioName(to),
        quantity: amount,
        memo: memo)
)
transaction.add(action: action)

transaction.signAndBroadcast { (result) in
    print(try! transaction.toJson(prettyPrinted: true))
    switch result {
    case .failure (let error):
        print("Error = \(error)")
        self.showAlert(title: error.errorCode.rawValue, message: "\(error.localizedDescription)", dismiss: "Sorry :(")
    case .success:
        if let transactionId = transaction.transactionId {
            print("SUCCESS!!!!!!")
            self.showAlert(title: "SUCCESS!!!!!!", message: "TransactionId: \(transactionId)", dismiss: "OK :)")
            print(transactionId)
        }
    }
}

直接使用

如果您发现您需要获取可用密钥或直接请求签名,则可以通过以下方式调用此库

let eosioAppSignatureProvider = EosioReferenceAuthenticatorSignatureProvider.shared
eosioAppSignatureProvider.returnUrl = "myappurl://"
eosioAppSignatureProvider.declaredDomain = "myapp.domain.com"

// Initialize security exclusions and set if desired. Optional.
if let theSecurityExclusions = self.securityExclusions {
    eosioAppSignatureProvider.securityExclusions = theSecurityExclusions
}

eosioAppSignatureProvider.getAvailableKeys() { (response) in
    if let error = response.error {
	     // Handle error
    }
    if let keys = response.keys {
        // Get Accounts for Keys and potentially let users choose which
        // account key to use.
    }
}

为了对EosioTransaction进行签名,创建一个EosioTransactionSignatureRequest对象,并以请求的形式调用带有请求的EosioReferenceAuthenticatorSignatureProvider.signTransaction(request:completion:)方法

let eosioAppSignatureProvider = EosioReferenceAuthenticatorSignatureProvider.shared
eosioAppSignatureProvider.returnUrl = "myappurl://"
eosioAppSignatureProvider.declaredDomain = "myapp.domain.com"

// Initialize security exclusions and set if desired. Optional.
if let theSecurityExclusions = self.securityExclusions {
    eosioAppSignatureProvider.securityExclusions = theSecurityExclusions
}

var signRequest = EosioTransactionSignatureRequest()
signRequest.serializedTransaction = serializedTransaction
signRequest.publicKeys = publicKeys
signRequest.chainId = chainId

eosioAppSignatureProvider.signTransaction(request: signRequest) { (response) in
    ...
}

架构

引用iOS身份验证器签名提供者使用Deep Link URL Query String Payload传输将请求数据发送到EOSIO引用iOS身份验证器应用。

EOSIO引用iOS身份验证器应用通过EosioReferenceAuthenticatorSignatureProvider.returnUrl将响应发送到请求的应用程序。响应形式为EosioAvailableKeysResponseEosioTransactionSignatureResponse

所有这些都是在EOSIO身份验证传输协议规范的协调下实现的。

Diagram

您的应用程序需要在引用iOS身份验证器签名提供者中注册您配置的URL方案,并在您的AppDelegate中实现application(_:open:options:)方法来处理EOSIO引用iOS身份验证器应用发送回来的URL和编码后的参数。

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    EosioReferenceAuthenticatorSignatureProvider.handleIncoming(url: url)
    return true
}

文档

请参阅在https://eosio.github.io/eosio-swift-reference-ios-authenticator-signature-provider生成的代码文档,或者通过克隆此存储库并在浏览器中打开docs/index.html文件。

库方法和选项

该库是EosioSignatureProviderProtocol的一个实现。它实现了以下协议方法

  • EosioSwiftReferenceAuthenticatorSignatureProvider.signTransaction(request:completion:)EosioTransaction进行签名。
  • EosioSwiftReferenceAuthenticatorSignatureProvider.getAvailableKeys(completion:)返回包含与对象初始化时使用的私钥相关联的公钥的响应。

EosioSwiftReferenceAuthenticatorSignatureProvider作为一个单例实现。要访问它,只需调用

  • let eosioAppSignatureProvider = EosioSwiftReferenceAuthenticatorSignatureProvider.shared它会返回当前实例,如果需要则会初始化。
  • 设置返回URL,如果您尚未设置,请设置。 eosioAppSignatureProvider.returnUrl = "myappurl://"
  • 如果您尚未设置,请设置用于匹配的声明域名。eosioAppSignatureProvider.declaredDomain = "myapp.domain.com"
  • 如果在进行开发和测试,可选地传递您希望设置的任何SecurityExclusionseosioAppSignatureProvider.securityExclusions = mySecurityExclusions。有关安全排除的更多信息,请参阅此处

参考iOS身份验证签名提供程序还包括其他功能,这些功能将帮助您处理、解码和验证来自EOSIO参考iOS身份验证应用程序的传入URL响应。

想要帮忙吗?

有兴趣贡献吗?那太好了!以下是一些贡献指南行为准则

许可证

MIT

重要

参见执照以获取版权和许可条款。Block.one 作为 EOSIO 社区的成员自愿做出贡献,不对软件的整体性能或任何相关应用的性能负责。我们不对软件或任何相关文档做出表示、保证、保证或承诺,无论是明示的还是默示的,包括但不限于保证适销性、针对特定目的的适用性和不侵犯。在任何情况下,我们不对任何索赔、损害或其他责任承担责任,无论此责任源于、发生于或与软件或文档的使用或其他交易有关,无论是基于合同、侵权或其他方式。任何测试结果或性能数据仅供参考,并不反映在所有条件下的性能。对本方或第三方产品、服务或其他资源的任何引用,均不代表 Block.one 的认可或推荐。我们不承担责任,并否认对我们使用或依赖任何这些资源的任何责任。第三方资源可能随时更新、更改或终止,因此这里的信息可能过时或不准确。

钱包和相关组件是复杂的软件,需要最高水平的安全性。如果构建或使用不当,它们可能会损害用户的私钥和数字资产。在投入使用之前,钱包应用和相关组件应进行彻底的安全评估。只有经验丰富的开发者才能使用此软件。