通过 Coinbase iOS SDK 检索所有用户钱包

Posted

技术标签:

【中文标题】通过 Coinbase iOS SDK 检索所有用户钱包【英文标题】:Retrieving All User Wallets through Coinbase iOS SDK 【发布时间】:2018-06-15 20:12:29 【问题描述】:

我最近一直在尝试使用 Coinbase ios SDK,但在检索用户的以太坊、莱特币和比特币现金余额以及历史交易时遇到了问题。目前,我只用比特币、美元和欧元做到了这一点,这似乎与 Coinbase 提供的演示应用程序的行为一致。

我已经使用 OAuth2 在 Coinbase API 访问页面上配置了一个应用程序,并且生成的客户端 ID 和密码正在应用程序中使用。

问题似乎源于我修改了 Coinbase iOS SDK 以允许我将帐户参数传递为 '全部'。我希望这样可以让我查看所有用户帐户(ETH、BTC、LTC 等)的详细信息,但是,在 Coinbase 对象上调用“getAccountsList”时,我只能获得 BTC、USD 和 EUR。

NSString *accessToken = [response objectForKey:@"access_token"];
Coinbase *client = [Coinbase coinbaseWithOAuthAccessToken:accessToken];

[client getAccountsList:^(NSArray *accounts, CoinbasePagingHelper *paging, NSError *error) 
    for (CoinbaseAccount *account in accounts) 
        // Only BTC, USD and EUR are in the accounts array at this point. 
    
];

这令人惊讶,因为权限请求页面正确地向用户询问所有钱包,如下面的屏幕截图所示:

我怀疑解决方案是使用 API 密钥,因为您可以准确指定要授予访问权限的帐户。但是,我计划分发该应用程序,因此不应使用此技术。

这是我发送的 URL 示例:

https://www.coinbase.com/oauth/authorize?response_type=code&client_id=CLIENT_ID_GOES_HERE&account=all&scope=balance%20transactions%20user&redirect_uri=com.example-name.example-app.coinbase-oauth%3A%2F%2Fcoinbase-oauth

有谁知道我如何使用 OAuth 请求访问所有用户帐户并检索每个帐户的详细信息?我定义的范围在某种程度上是否不正确?我能想到的唯一选择是逐个请求访问每个钱包并存储单独的访问令牌。然而,这不会是一个很好的用户体验。

谢谢!

【问题讨论】:

【参考方案1】:

添加参数

account=all

到 oAuth 端点:https://coinbase.com/oauth/authorize?account=all&response_type=code.‌​..

详情如下:https://developers.coinbase.com/docs/wallet/coinbase-connect/permissions

Coinbase Connect 应用程序可以请求对用户钱包的不同访问权限。此访问权限由 OAuth2 授权 URL 上的帐户参数定义。可用选项有:`

选择 -(默认)允许用户选择与应用程序关联的钱包 new - 应用程序将创建一个新钱包(以应用程序命名) all - 应用程序可以访问所有用户的钱包

【讨论】:

正如我的问题中提到的,我已经修改了 SDK 以添加 account 参数,并且我正在传递 all。这按预期工作,因为向用户显示的授权请求要求访问所有帐户。问题是我只获得了使用返回的访问令牌时提到的三个帐户的详细信息。 我已经编辑了我的原始问题以添加权限请求页面的屏幕截图,该页面正确地要求用户访问所有钱包。【参考方案2】:

我认为 iOS SDK 需要更新。它仍然连接到旧的 API 版本。

我使用的是原始的 Coinbase SDK。没有叉子。相反,在 wallet:accounts:read 范围旁边,我还将 ["accounts": "all"] 添加为 startAuthentication 方法的元参数。

与。我没有使用getAccountList 方法,而是使用更通用的.doGet 方法和api v2 帐户端点(所以coinbase.doGet("https://api.coinbase.com/v2/accounts", parameters: nil) (response, error) -> Void in

这为我提供了所有钱包的帐户信息。在这种情况下,您确实需要对响应对象进行一些 json 处理。

【讨论】:

在确认 SDK 已过期后,我最终放弃了 Coinbase,因此我没有机会测试您的解决方案。听起来这可能是最好的选择。【参考方案3】:

首先如果没有,需要create an account on Coinbase

那你先去Coinbase digital api documentation看看吧,我同意你用API获取数据可能更方便(如果目标账户只是你自己的个人账户)

因为根据Coinbase:

API Key 身份验证只能用于访问您自己的帐户或商家订单。如果您的应用程序需要访问其他 Coinbase 用户的帐户,请不要使用 API Key。要安全访问其他 Coinbase 用户的帐户,请使用 Coinbase Connect (OAuth2)

你有两种可能:


使用 API

假设用户已根据wallet permission documentation. 将wallet:accounts:read 授予API 密钥(允许您列出用户的帐户及其余额)

完成后,您可以在 iOS 上使用官方 wallet client libraries - coinbase 可通过 CocoaPods 获得 - 将以下行添加到您的 Podfile: :

pod "coinbase-official"

使用 OAuth2 协议

根据this,

它比 API Key 身份验证方法稍微复杂一些,但更灵活。 OAuth2 适用于 Web 应用程序以及桌面和移动应用程序。

coinbase-connect integrating documentation有很多信息,你也可以先看看official OAuth2 protocol website。

假设您对 OAuth2 没问题,您还必须在请求数据之前要求用户授予您权限。

由于您需要访问用户钱包,您仍然需要请求访问令牌并在授权请求中添加一个scope 参数(逗号分隔的权限(范围)您的应用程序请求访问的列表),如果您需要查看完整的范围列表请参考自己to this page。

所需范围与API方法相同:wallet:accounts:read,您的请求将如下所示:

GET https://www.coinbase.com/oauth/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URL&state=SECURE_RANDOM&scope=wallet:accounts:read

请求成功后,会在响应中返回一个有效的访问令牌(像这样):


"access_token": "6915ab99857fec1e6f2f6c078583756d0c09d7207750baea28dfbc3d4b0f2cb80",
"token_type": "bearer",
"expires_in": 7200,
"refresh_token": "73a3431906de603504c1e8437709b0f47d07bed11981fe61b522278a81a9232b7",
"scope": "wallet:user:read wallet:accounts:read"

获得访问令牌后,如果在请求中添加以下标头,则可以进行与先前范围对应的任何 API 调用:

Authorization: Bearer 6915ab99857fec1e6f2f6c078583756d0c09d7207750baea28dfbc3d4b0f2cb80

最后,您可以参考API reference documentation 以查看所有可能的 API 调用和相关范围。


最后,你需要授予权限,然后列出用户帐户,然后你可能会得到任何account resource:

账户资源代表用户的所有账户,包括比特币、比特币现金、莱特币和以太坊钱包、法定货币账户和保险库。

问候

【讨论】:

感谢您的详细回复。不幸的是,看起来一切都已经按照您的解释进行了配置和工作。正如您从我现在添加到原始问题的屏幕截图中看到的那样,正在按预期请求权限。收到的访问令牌似乎不允许返回 ETH、BCH 和 LTC 钱包信息。我的请求与您的示例相匹配,但在列出范围的方式上有所不同(两种方式都基于我的测试),所以我很困惑。您确定收到所有钱包(包括我遇到问题的钱包)吗? 请您仔细检查您是否可以使用 API 访问所有钱包? 您会如何建议这样做?通过使用getAccountsList,我收到了三个账户——“BTC”、“EUR”和“GBP”。【参考方案4】:

还是没有运气。

尝试添加参数account=all。它让我可以访问所有钱包(与 op 完全相同)。但是,在代码中,我只能获得 BTC Wallet、BTC Vault、EUR Wallet 和新创建的 BTC Wallet。新钱包是通过添加参数account=new创建的。

尝试添加参数 account_currency=BTC,ETH 并在 oAuth 授权中选择 ETH 钱包。 getAccountsList 是否返回了 0 个对象,并且服务器没有错误。

尝试撤销我的 Coinbase 帐户中的所有 API 应用程序访问权限(设置->安全)。

范围:balance transactions user

端点:.../oauth/authorize?account=all&response_type=code&client_id=%...

【讨论】:

以上是关于通过 Coinbase iOS SDK 检索所有用户钱包的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 agora.io Unity SDK 检索频道用户列表

我可以同时使用 FB iOS SDK 和 FB Graph API 来检索 FB 好友列表吗?

Coinbase API:如何获取所有受支持硬币的现货价格

Facebook iOS SDK:检索用户的电话号码和国家

当我的钱包地址收到比特币时的 Coinbase 付款通知

以太币现货价格的 Coinbase HTTP 请求