Ios 通过Swift获取Youtube API的OAuth2访问令牌
我正在开发一个iOS移动应用程序,需要使用Youtube数据API上传视频。一般来说,我了解所需的工作流程: 1) 使用clientId、clientSecret和其他详细信息向身份验证端点发送请求 2) 该服务对客户端进行身份验证,并将请求发送回包含访问令牌的客户端指定的回调URL 3) 客户机在他/她想要发送未来请求时,在头中提供令牌 我已经使用node.js脚本成功上传了Youtube视频,但我在理解如何在Swift中实现这一点时遇到了很多困难。在我的VideoManagementController中,我有一个按钮,可以触发上载示例.mp4文件: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
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)
当然可以。将问题和控制器的格式化源代码作为问题发布,并在注释中标记我。我很难知道该回答什么,因为我只看到您代码的一小部分。