草庐IT

ios - 在用于 REST 的 Objective-C 的 Google API 客户端库中上传带有 "fixed" token 的 Youtube 视频

coder 2024-01-29 原文

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

我正在使用适用于 REST 的 Objective-C 的 Google API 客户端库,有了这个库,我可以使用“标准”上传流程:

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

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

用户录制视频 -> 他按下上传按钮 -> 视频将上传到应用的 youtube channel 。

我找到的唯一帮助是这个 article ,它解释了一种获取可刷新应用程序 token 以在应用程序 channel 中上传视频的方法。这正是我所需要的。无论如何,这是一个网络示例,它上传服务器中的视频。我的视频在手机里,所以我想我必须这样修改这篇文章的流程:

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

在我的应用程序中有了这个流程,我需要另一个流程:

用户录制视频 -> 按上传按钮 -> 我调用了 get_token.php 并检索了实际的 token -> 我通过库调用了检索到的 token ,以将视频上传到应用程序的 youtube channel 。

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

#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 而不是他们从标准身份验证工作流程中检索的方法?

最佳答案

这不是一个真正的答案,但它对于评论来说太重要了。

因此,您想要创建一个允许其他人上传到您的 youtube channel 的应用程序。通常我会说使用一个服务帐户,它可以让你更容易地做到这一点。但是 YouTube API 不支持服务帐户。

保存刷新 token 后,您将需要对应用进行身份验证,然后将此刷新 token 嵌入到您的应用中。

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

刷新 token 可能会过期,因此如果它确实过期或损坏,那么您将不得不再次对应用进行身份验证并将新的刷新 token 嵌入到您的应用中并向您的用户发布新版本。

另一种方法是设置一个带有刷新 token 的网络服务,并让您的应用访问该网络服务以进行上传。然后,如果刷新 token 损坏,您只需在您的网络服务上修复它。

在它变得困惑之前我已经这样做了,但真的没有其他方法可以做到这一点。

关于ios - 在用于 REST 的 Objective-C 的 Google API 客户端库中上传带有 "fixed" token 的 Youtube 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45917122/

有关ios - 在用于 REST 的 Objective-C 的 Google API 客户端库中上传带有 "fixed" token 的 Youtube 视频的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  5. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

  6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  9. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  10. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

随机推荐