我正在尝试创建一个在指定频道上传视频的应用,而不会提示登录页面。我会尝试更好地解释我需要的东西。
我使用用于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工作流程中检索的方法?
答案 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;
}