Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过Swift获取Youtube API的OAuth2访问令牌_Ios_Swift_Oauth 2.0_Youtube Data Api - Fatal编程技术网

Ios 通过Swift获取Youtube API的OAuth2访问令牌

Ios 通过Swift获取Youtube API的OAuth2访问令牌,ios,swift,oauth-2.0,youtube-data-api,Ios,Swift,Oauth 2.0,Youtube Data Api,我正在开发一个iOS移动应用程序,需要使用Youtube数据API上传视频。一般来说,我了解所需的工作流程: 1) 使用clientId、clientSecret和其他详细信息向身份验证端点发送请求 2) 该服务对客户端进行身份验证,并将请求发送回包含访问令牌的客户端指定的回调URL 3) 客户机在他/她想要发送未来请求时,在头中提供令牌 我已经使用node.js脚本成功上传了Youtube视频,但我在理解如何在Swift中实现这一点时遇到了很多困难。在我的VideoManagementCont

我正在开发一个iOS移动应用程序,需要使用Youtube数据API上传视频。一般来说,我了解所需的工作流程:

1) 使用clientId、clientSecret和其他详细信息向身份验证端点发送请求

2) 该服务对客户端进行身份验证,并将请求发送回包含访问令牌的客户端指定的回调URL

3) 客户机在他/她想要发送未来请求时,在头中提供令牌

我已经使用node.js脚本成功上传了Youtube视频,但我在理解如何在Swift中实现这一点时遇到了很多困难。在我的VideoManagementController中,我有一个按钮,可以触发上载示例.mp4文件:

   let headers = ["Authorization": "Bearer \(self.newToken))"]

        let path = Bundle.main.path(forResource: "sample", ofType: ".mp4")


        let videodata : NSData = NSData.dataWithContentsOfMappedFile(path!)! as! NSData
        print("TOKEN: \(String(describing: token))")
        Alamofire.request("https://www.googleapis.com/upload/youtube/v3/videos?part=id", method: .post, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { (response) in

            print(response)
        }
我正试图在控制器的viewDidLoad()阶段检索我的访问令牌:

  let authorizationEndpoint = URL(string: "https://accounts.google.com/o/oauth2/v2/auth")
    let tokenEndpoint = URL(string: "https://www.googleapis.com/oauth2/v4/token")
    let configuration = OIDServiceConfiguration(authorizationEndpoint: authorizationEndpoint!, tokenEndpoint: tokenEndpoint!)

    let request = OIDAuthorizationRequest(configuration: configuration, clientId: self.kClientID, scopes: [OIDScopeOpenID, OIDScopeProfile], redirectURL: self.KRedirectURI!, responseType: OIDResponseTypeCode, additionalParameters: nil)

    let appDelegate: AppDelegate? = (UIApplication.shared.delegate as? AppDelegate)
    print("REACHED")

    appDelegate?.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request, presenting: self, callback: {(_ authState: OIDAuthState?, _ error: Error?) -> Void in
        if (authState != nil) {
            print("TOKEN: Got authorization tokens. Access token: \(String(describing: authState?.lastTokenResponse?.accessToken))")
            self.newToken = authState?.lastTokenResponse?.accessToken
            self.authState = authState
        }
        else {
            print("TOKEN: Authorization error: \(String(describing: error?.localizedDescription))")
            self.authState = nil
        }
    })
问题是,我的访问令牌检索代码实际上挂起并且永远不会完成。它到达print语句
“reacted”
,但从未从以下代码部分出来:

appDelegate?.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: request, presenting: self, callback: {(_ authState: OIDAuthState?, _ error: Error?) -> Void in
        if (authState != nil) {
            print("TOKEN: Got authorization tokens. Access token: \(String(describing: authState?.lastTokenResponse?.accessToken))")
            self.newToken = authState?.lastTokenResponse?.accessToken

        }
        else {
            print("TOKEN: Authorization error: \(String(describing: error?.localizedDescription))")
            self.authState = nil
        }
我既没有获得新令牌,也没有获得
授权错误
打印输出


我怀疑这与我的回调URL有关。我认为斯威夫特不知道从哪里“监听”我的访问令牌。例如,在node.js中设置callbackURL端点相对容易,但在Swift中如何设置?或者这是真正的问题吗?

我已经厌倦了这样的代码,您还需要检查一下编码类型URLEncoding.httpBody希望它可以帮助我,它可以帮助我通过oauth使用

 let headers = [
        "Content-Type": "application/x-www-form-urlencoded"
    ]

    Alamofire.request("https://accounts.google.com/o/oauth2/revoke?token={\(token)}", method: .post, parameters: parameters, encoding:  URLEncoding.httpBody, headers: headers).responseJSON { (response:DataResponse<Any>) in
let头=[
“内容类型”:“应用程序/x-www-form-urlencoded”
]
Alamofire.request(“https://accounts.google.com/o/oauth2/revoke?token={\(令牌)},方法:.post,参数:参数,编码:URLEncoding.httpBody,头:headers.responseJSON{(响应:DataResponse)in

我已经厌倦了这样的代码,您还需要检查一下编码类型URLEncoding.httpBody希望它能有所帮助,它可以帮助我通过oauth使用

 let headers = [
        "Content-Type": "application/x-www-form-urlencoded"
    ]

    Alamofire.request("https://accounts.google.com/o/oauth2/revoke?token={\(token)}", method: .post, parameters: parameters, encoding:  URLEncoding.httpBody, headers: headers).responseJSON { (response:DataResponse<Any>) in
let头=[
“内容类型”:“应用程序/x-www-form-urlencoded”
]
Alamofire.request(“https://accounts.google.com/o/oauth2/revoke?token={\(令牌)},方法:.post,参数:参数,编码:URLEncoding.httpBody,头:headers.responseJSON{(响应:DataResponse)in

嘿,我还在从事一个Swift YouTube项目。我在使用刷新令牌获取Alamofire的常规令牌时遇到问题,您是否有可能提供帮助?错误=“unsupported\u grant\u type”,描述为“Invalid grant\u type:。谢谢!
let endpoint=”https://www.googleapis.com/oauth2/v4/token“let参数=[“客户端id”:客户端id,“刷新令牌”:刷新令牌,“授权类型”:“刷新令牌”];Alamofire.request(端点,方法:.post,参数:参数,编码:JSONEncoding.default)
当然可以。将问题和控制器的格式化源代码作为问题发布,并在评论中标记我。很难知道该回答什么,因为我只看到了您代码的一小部分。嘿,我还在处理一个Swift YouTube项目。我在使用刷新令牌与Alamofire获取常规令牌时遇到问题,有什么问题吗ce您可以提供帮助吗?错误=“unsupported\u grant\u type”,描述为“Invalid grant\u type:”。谢谢!
let endpoint=”https://www.googleapis.com/oauth2/v4/token“let parameters=[“client\u id”:client\u id,“refresh\u token”:refresh\u token,“grant\u type”:“refresh\u token”];Alamofire.request(端点,方法:.post,参数:parameters,encoding:JSONEncoding.default)
当然可以。将问题和控制器的格式化源代码作为问题发布,并在注释中标记我。我很难知道该回答什么,因为我只看到您代码的一小部分。