【发布时间】:2020-01-16 17:22:13
【问题描述】:
程序运行正常,去GitHub站点进行数据解析,当我允许时,它返回程序,但没有执行访问令牌请求
import UIKit
import SafariServices
import Alamofire
let kSafariViewControllerCloseNotification = "kSafariViewControllerCloseNotification"
class AuthenticationViewController: UIViewController, SFSafariViewControllerDelegate {
var safariVC: SFSafariViewController?
@IBOutlet weak var loginButton: UIButton!
// data from your Github app
let client_id = "********"
let client_secret = "***************"
let scope = "repo"
let redirect_uris = ["clientforgithub://oauth/callback"]
let token_uri = "https://github.com/login/oauth/access_token"
override func viewDidLoad() {
super.viewDidLoad()
// add observer to vc
NotificationCenter.default.addObserver(self, selector: #selector(safariLogin(notification:)), name: NSNotification.Name(rawValue: kSafariViewControllerCloseNotification), object: nil)
}
@IBAction func loginButtonTapped(_ sender: Any) {
// you can set the scope and client id
if let stringUrl = "https://github.com/login/oauth/authorize?scope=\(scope)&client_id=\(client_id)".addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed), let url = URL(string: stringUrl) {
safariVC = SFSafariViewController(url: url)
safariVC!.delegate = self
self.present(safariVC!, animated: true, completion: nil)
}
}
@objc func safariLogin(notification: NSNotification) {
// returned url from Github
let url = notification.object as! NSURL
// returned code
let code = self.getParameterFrom(url: String(describing: url), param: "code")
// parameters for access token request
let parameters = ["client_id": client_id, "client_secret": client_secret, "code": code, "accept": "application/json"] as [String : Any]
//*******************this request is not being executed*******************
// get access token from Github with the code
request(token_uri, method: .post, parameters: parameters).responseString { response in
if let result = response.result.value, let makeItUrl = NSURL(string: "https://api.github.com/?\(result)") {
if let access_code = self.getParameterFrom(url: String(describing: makeItUrl), param: "access_token") {
// # here is the access token # //
print(access_code)
let defaults = UserDefaults.standard
defaults.set("\(access_code)", forKey: "MyKey")
defaults.synchronize()
}
}
}
// dismiss the Safari View Controller
self.safariVC!.dismiss(animated: true, completion: nil)
self.performSegue(withIdentifier: "HomeSegue1", sender: self)
}
// parse the parameters from the url string
func getParameterFrom(url: String, param: String) -> String? {
guard let url = URLComponents(string: url) else { return nil }
return url.queryItems?.first(where: { $0.name == param })?.value
}
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
// dismiss the SafariViewController
controller.dismiss(animated: true)
}
}
程序运行正常,去GitHub站点进行数据解析,当我允许时,它返回程序,但没有执行访问令牌请求
【问题讨论】:
-
您好,欢迎来到 Stack Overflow! OAuth 过程要求应用程序处理重定向 URL。我可以看到您的应用程序将重定向 URL 传递给 OAuth 进程,所以我的问题是:您是否在 App Delegate 中管理令牌的接收?检查 UIApplicationDelegate 的
application(_:open:options:)方法并打印 URL 以查看您在该方法的实现中有效地接收了 Token。 -
@MikeTaverne 感谢您的回复,问题确实出在您写的地方,但是我仍然没有得到访问令牌,请求返回获取访问令牌的代码不正确,在 GitHub 上它说:如果您传递的验证码不正确、过期或与您在第一次授权请求中收到的不匹配,您将收到此错误。但是我不明白为什么代码不正确
标签: ios swift authentication alamofire