1

我有一个 API,需要在获得长期会话令牌之前使用 HOTP/TOTP 代码注册一次。

有什么方法(理论上)iOS 应用可以“调用”Google Authenticator 的修改版本,允许一次性交换 HOTP/TOTP 代码?

我假设 Google Authenticator 的修改版本会发出类似的提示

“您确定要将 XXX 的代码发送给 YYY 吗?”

有什么办法可以实现这种情况吗?缺少这一点,我将不得不引导用户在应用程序之间进行多任务处理,这是我的消费者不知道如何在 iOS 上执行的功能。(双击手机或 iPad 底部的按钮会避开他们)

一些让我认为这是可能的想法:

  • 我看到 Safari 中的网络链接在设备上打开了一个应用程序,或者在安装时打开应用程序而不是 .mobile 版本的网站(Foursquare、Facebook 等)

  • 应用程序可以在 Safari 或 Chrome 中打开网站

综合考虑这些想法,我可以添加一个包含 HOTP 代码的 URL 参数,并通过 HTTPS 将其“反弹回来”,但我想要一个更本地化的解决方案


致接近者的注意事项:我在 Security.SE 上问这个问题是因为我认为这里的人可能最了解 iOS 沙盒,因为这里需要的概念和技能在概念上可能类似于有 74 多个问题的 ASLR 和 DEP在网站上

4

1 回答 1

2

是的,只需使用共享UIApplication对象和openURL方法。该方案在 Google Authenticator wiki的KeyUriFormat 页面中有详细说明。

代码应如下所示:

NSString *issuer = @"Example";
NSString *accountname = @"alice@google.com";
NSString *label = [NSString stringWithFormat:@"%@:%@",issuer,accountname];
NSString *secret = @"JBSWY3DPEHPK3PXP";
NSString *algorithm = @"SHA1";
NSString *digits = @"6";
NSString *period = @"30";

NSString *urlPath = [NSString stringWithFormat:@"otpauth://totp/%@?secret=%@&issuer=%@&algorithm=%@&digits=%@&period=%@",label,secret,issuer,algorithm,digits,period];
NSURL *url = [NSURL URLWithString:urlPath];
[[UIApplication sharedApplication] openURL:url];

但是,目前似乎有这个错误会导致当前版本的 iOS 应用程序崩溃(我已经测试过了)。

:(

或者,您可以将自己的 TOTP 实现合并到您的应用程序中。不算太复杂,其实我这里整理了一个简单的例子。

于 2014-04-22T08:08:54.167 回答