【问题标题】:iOS Handling requests with refreshed authentication tokensiOS 使用刷新的身份验证令牌处理请求
【发布时间】:2015-02-11 08:27:13
【问题描述】:

在 iPhone 应用上工作时,我使用 Google Plus SDK (GPPSignIn) 来获取和刷新身份验证令牌。

这些令牌持续 1 小时。当我使用过期令牌发出请求时,我正在使用的 Web 服务会返回特定的 http 响应代码,以便我知道我的令牌已过期。

收到我的令牌已过期的响应后,我会调用以刷新身份验证令牌。现在我想使用新令牌重复对 Web 服务的请求。我想在我的服务器请求对象中完成这一切。

如果我自己编写整个作品,我可以将令牌刷新请求与 Web 服务器请求内联,当令牌请求完成后,我可以继续处理 Web 服务器请求。但由于令牌工作是通过 Google Plus SDK 完成的,并且他们使用委托模型来传达身份验证请求的完成情况,所以在刷新令牌之前,我不知道如何将请求保存到 Web 服务。

目前我正在尝试一个“非常糟糕”的想法,如下所示,我尝试将我的请求放入一个新线程,然后让该线程休眠一段时间,此时它会唤醒我们希望新令牌可用。但必须有更好的方法!

             if (error !=nil && error.code == NSURLErrorUserCancelledAuthentication) {
             //special handling of 401, which may be a Google Auth token failure.
             // if it is, then let's go get a new token.

                 User *client = [[User alloc] init];

                 if(client.email != nil && client.password != nil){

                     if (client.accountType == AuthTypeGoogle) {
                         NSLog(@"attempt to get a new token");

                         // request new token
                         [client silentGoogleAuthentication];

                         //repeat request
                         if (repeatableRequest) {
                             dispatch_async(repeatQueue, ^{
                                     [NSThread sleepForTimeInterval:4];
                                     NSLog(@"sleepytime");
                                     [self assignCredentialstoRequest];
                                     [self makeRequest:notificationName repeatableRequest:false];

                             });

                         }
                     }
                 }
             }

任何指针将不胜感激。我查看了许多 iOS 令牌刷新票证,发现很多过时的问题,但没有一个可行的解决方案。

【问题讨论】:

    标签: ios cocoa oauth token google-plus-signin


    【解决方案1】:

    所以在思考了这个问题之后,我意识到了一些事情。

    1. 我真正想要的是拥有 [客户端静默谷歌身份验证]; 调用做所有的内联处理。深入研究代码,我发现即使它是 GPPSSignIn trySilentAuthentication 支持委托,但它在完成自身处理时也会返回一个布尔值。
    2. 我的进程已经在主线程之外运行,所以委托对我来说几乎没有价值。
    3. GPPSSign 输入使用共享实例,因此如果处理完成,我可以调用共享实例并直接访问结果。

    因此,有了这两条信息,我能够 [客户端静默谷歌身份验证]; 调用捕获 trySilentAuthentication 调用的结果,然后将结果分配到代码中的正确位置,然后将布尔值返回给初始调用 [client silentGoogleAuthentication] 并继续进行的函数。像这样:

        // Try signing in silently so user doesn't have to be prompted again
    BOOL authResponse = [signIn trySilentAuthentication];
    if (authResponse) {
        NSLog(@"successful auth");
        NSLog(@"idToken is %@", [GPPSignIn sharedInstance].idToken);
        self.accountType = AuthTypeGoogle;
        self.password = [GPPSignIn sharedInstance].idToken;
        [self updateCredentials];
        return true;
    } else {
        return false;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 2016-02-23
      • 1970-01-01
      • 2017-11-08
      • 2017-12-29
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多