我正在使用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中执行此操作?或者这甚至是真正的问题?
答案 0 :(得分:0)
我已经厌倦了这样的代码,你还需要检查某些时候的编码类型 URLEncoding.httpBody 希望它可以帮助,它可以帮助我通过oauth使用
data: {var1: var1,
var2: var2,
var3: var3}