iOS使用刷新的身份验证令牌处理请求

时间:2015-02-11 08:27:13

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

使用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令牌刷新门票,我看到了很多陈旧的问题,但没有一个有可行的解决方案。

1 个答案:

答案 0 :(得分:1)

因此在考虑了这个问题之后,我意识到了一些事情。

  1. 我真正想要的是拥有 [client silentGoogleAuthentication]; 调用内联所有处理。进一步挖掘代码,我发现即使它是GPPSSignIn,trySilentAuthentication也支持委托,但它在处理完成后也会返回一个布尔值。
  2. 我的进程已经在主线程之外运行,因此委托对我来说没什么价值。
  3. GPPSSign in使用共享实例,因此如果处理完成,我可以调用共享实例并直接访问结果。
  4. 所以掌握了这两条信息,我就能够了     [client silentGoogleAuthentication]; 调用捕获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;
    }