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

时间:2017-07-06 19:19:58

标签: ios swift oauth-2.0 youtube-data-api

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

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

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

3)只要客户想要发送未来的请求,客户端就会在标题中提供令牌。

我已经使用node.js脚本成功上传了Youtube视频,但我在理解如何在Swift中实现此功能时遇到了很多麻烦。在我的 VideoManagementController 中,我有一个触发上传 sample.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
        }
    })

问题是我的访问令牌检索代码基本上挂起并且永远不会完成。它到达打印语句"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

        }
        else {
            print("TOKEN: Authorization error: \(String(describing: error?.localizedDescription))")
            self.authState = nil
        }

我既没有获得新令牌,也没有authorization error打印出来。

我怀疑它与我的callbackURL有关。我不认为斯威夫特知道在哪里听#34;从中获取我的访问令牌。例如,callbackURL端点在node.js中设置服务器端相对容易,但是如何在Swift中执行此操作?或者这甚至是真正的问题?

1 个答案:

答案 0 :(得分:0)

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

data: {var1: var1,
       var2: var2,
       var3: var3}