使用"修复"上传Youtube视频用于REST的Objective-C的Google API客户端库中的令牌

时间:2017-08-28 10:42:04

标签: ios objective-c youtube youtube-api

我正在尝试创建一个在指定频道上传视频的应用,而不会提示登录页面。我会尝试更好地解释我需要的东西。

我使用用于REST的Objective-C的Google API客户端库,使用此库我可以使用"标准"上传流程:

用户录制视频 - >他按下上传按钮 - > Safari打开登录谷歌页面 - >用户在自己的帐户中登录并授予该应用的权限 - > Safari重定向回ios应用程序 - >上传过程开始 - >视频将上传到个人用户频道。

相反,这是我的ios应用程序所需的工作流程:

用户录制视频 - >他按下上传按钮 - >该视频将上传到应用的YouTube频道。

我找到的唯一帮助是此article,它解释了获取可刷新的应用令牌以在应用渠道中上传视频的方法。这正是我需要的。无论如何,这是一个Web示例,它上传服务器中的视频。我的视频在手机中,所以我认为我必须以这种方式修改本文的流程:

首次通过登录获取令牌作为频道所有者 - >创建一个token.txt并将其保存在我的服务器中 - >创建一个名为get_token.php的页面,用于打印token.txt的内容,并在令牌过期时刷新它。

在我的应用程序中使用此流程我需要另外一个流程:

用户录制视频 - >按上传按钮 - >我打电话给get_token.php并检索实际令牌 - >我通过图书馆拨打电话,重新启动令牌,将视频上传到应用程序的YouTube频道。

这里我发现了一些问题,这是我的身份验证方法:

#pragma mark - Sign In
- (void)authNoCodeExchange {
    [self verifyConfig];

    NSURL *issuer = [NSURL URLWithString:kIssuer];

    [self logMessage:@"Fetching configuration for issuer: %@", issuer];



    // discovers endpoints
    [OIDAuthorizationService discoverServiceConfigurationForIssuer:issuer
                                                        completion:^(OIDServiceConfiguration *_Nullable configuration, NSError *_Nullable error) {
                                                            if (!configuration) {
                                                                [self logMessage:@"Error retrieving discovery document: %@", [error localizedDescription]];
                                                                return;
                                                            }

                                                            [self logMessage:@"Got configuration: %@", configuration];

                                                            if (!kClientID) {
                                                                [self doClientRegistration:configuration
                                                                                  callback:^(OIDServiceConfiguration *configuration,
                                                                                             OIDRegistrationResponse *registrationResponse) {
                                                                                      [self doAuthWithoutCodeExchange:configuration
                                                                                                             clientID:registrationResponse.clientID
                                                                                                         clientSecret:registrationResponse.clientSecret];
                                                                                  }];
                                                            } else {
                                                                [self doAuthWithoutCodeExchangeCri:configuration clientID:kClientID clientSecret:nil];
                                                            }
                                                        }];
}



/////////////////
- (void)doAuthWithoutCodeExchangeCri:(OIDServiceConfiguration *)configuration
                         clientID:(NSString *)clientID
                     clientSecret:(NSString *)clientSecret {
    NSURL *redirectURI = [NSURL URLWithString:kRedirectURI];
    OIDTokenRequest *tokenExchangeRequest =
    [_authState.lastAuthorizationResponse tokenExchangeRequest];
    [OIDAuthorizationService performTokenRequest:tokenExchangeRequest
                                        callback:^(OIDTokenResponse *_Nullable tokenResponse,
                                                   NSError *_Nullable error) {

                                            if (!tokenResponse) {
                                                [self logMessage:@"Token exchange error: %@", [error localizedDescription]];
                                            } else {
                                                [self logMessage:@"Received token response with accessToken: %@", tokenResponse.accessToken];
                                            }



                                            [_authState updateWithTokenResponse:tokenResponse error:error];


                                            GTMAppAuthFetcherAuthorization *gtmAuthorization =
                                            [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState];

                                            // Sets the authorizer on the GTLRYouTubeService object so API calls will be authenticated.
                                            self.youTubeService.authorizer = gtmAuthorization;

                                            // Serializes authorization to keychain in GTMAppAuth format.
                                            [GTMAppAuthFetcherAuthorization saveAuthorization:gtmAuthorization
                                                                            toKeychainForName:kGTMAppAuthKeychainItemName];

                                            [self uploadVideoFile];

                                        }];

}

我也有类似的东西:

NSString * RetrivedToken = @"ya29xxxxxxx3nJxxxxxxx6qqQ-FxxxxxxxdGH";

我如何修改这些方法来接受我的retrivedtoken,而不是他们从标准的auth工作流程中检索的方法?

2 个答案:

答案 0 :(得分:0)

这不是一个真正的答案,但它的评论很重要。

因此,您希望创建一个允许其他人上传到您的YouTube频道的应用。通常我会说使用一个服务帐户,这将使您更容易做到这一点。但是,YouTube api不支持服务帐户。

一旦保存刷新令牌,您就需要对应用进行身份验证,然后在您的应用中嵌入此刷新令牌。

为什么使用移动应用程序这不是一个好主意。

刷新令牌可能会过期,因此如果它过期或中断,那么您必须再次对应用进行身份验证,并将新的刷新令牌嵌入到您的应用中,并向您的用户发布新版本。

另一种方法是设置一个带有刷新令牌的Web服务,让您的应用访问Web服务进行上传。然后,如果刷新令牌中断,则只需在Web服务上修复它。

我在凌乱之前做过这个,但实际上没有办法做到这一点。

答案 1 :(得分:0)

您可以从代码中看到

if (!tokenResponse) {
[self logMessage:@"Token exchange error: %@", [error localizedDescription]];
} else {
[self logMessage:@"Received token response with accessToken: %@", tokenResponse.accessToken];
 }

您正在使用其他代码中的OIDTokenResponse对象tokenResponse。 首先创建类OIDTokenResponse的对象,如* oidTokenResponse,并从服务器分配您的访问令牌,如

oidTokenResponse.accessToken=YOUR_TOKEN_FROM_SERVER;

然后使用

[_authState updateWithTokenResponse:oidTokenResponse error:error];

在其他方面你也可以这样做,你不需要改变你的代码,你可以使用一行代码,但我不确定你是否允许更改为访问令牌,但你可以尝试它

保留其他代码,只需在您的其他内容中再添加一行

if (!tokenResponse) {
[self logMessage:@"Token exchange error: %@", [error    localizedDescription]];
} else {
[self logMessage:@"Received token response with accessToken: %@",      tokenResponse.accessToken];
tokenResponse.accessToken=YOUR_TOKEN_FROM_SERVER;
}