我正在尝试使用iOS / swift验证w OAuth2和Eventbrite。这是我的相关代码段:

let oauthswift = OAuth2Swift(
        consumerKey:    Eventbrite["consumerKey"]!,
        consumerSecret: Eventbrite["consumerSecret"]!,
        authorizeUrl:   "https://www.eventbrite.com/oauth/authorize",
        accessTokenUrl: "https://www.eventbrite.com/oauth/token",
        responseType:   "code"
    )
    oauthswift.authorizeWithCallbackURL( NSURL(string: "oauth2-swift://oauth-callback/eventbrite")!, scope: "", state: "",
        success: {
            credential, response, parameters in
            self.showAlertView("Eventbrite", message: "oauth_token:\(credential.oauth_token)")
        }, failure: {(error:NSError!) -> Void in
            println(error.localizedDescription)
    })


但是,当我接受我想将此应用程序与我的帐户连接后,进入eventbrite oauth页面时,在eventbrite中看到“糟糕,出了点问题”错误。网址为:https://www.eventbrite.com/oauth/authorize?client_id= {MyClientId}&redirect_uri = oauth2-swift:// oauth-callback / eventbrite&response_type = code

我已将“ oauth-swift” URL方案添加到info.plist。

这是我的eventbrite应用程序设置:
应用程序URL:http://mywebsite.com
OAuth重定向Uri:oauth-swift:// oauth-callback / eventbrite

如何将用户重定向到我的应用程序,以便我可以检索访问令牌?当我尝试对Eventbrite进行身份验证时,不会调用应用程序委托/ openURL函数(当我尝试对Foursquare和Instagram进行调用时会调用该函数)。另外,我在Foursquare和Instagram上尝试了OAuth2,并且工作正常。

我是否缺少OAuth2特有的东西,而Eventbrite没有我的应用设置,代码等?谢谢

最佳答案

在iOS中使用OAuth时需要注意的几件事:


如果您打算在App Store中分发您的应用程序,请确保不使用Safari进行身份验证。您必须在您的应用程序中执行此操作,最好的地方是使用WebView。
切勿将您的App / Consumer Secret存储在iOS App中。


现在,如何通过WebView实现OAuth身份验证?


如果使用情节提要板,则将WebView拖到ViewController中。还要为ViewController创建一个类文件,并为WebView创建一个IBOutlet。
在ViewController的viewDidAppear函数上,设置WebView以加载您的授权URL。

authorisationURL = "https://www.eventbrite.com/oauth/authorize?client_id=YOUR_CLIENT_KEY&response_type=code&redirect_uri=REDIRECT_URI"

self.webView.loadRequest(NSURLRequest(URL: NSURL(string: authorisationURL)!))

UIWebViewDelegate协议添加到ViewController并添加功能webViewDidFinishLoad(webView: UIWebView)。每当WebView完成页面加载时,都会调用此函数。
用户提供对您的应用的访问权限后,Eventbrite会将您重定向到您随代码提供的重定向uri。例如https://localhost?code=xxxx。我们可以通过阅读此URL来访问代码。

if (webView.request?.URL?.absoluteString!.rangeOfString("code=") != nil) {
    let queryString = webView.request?.URL?.query
    println(queryString)
    let authenticationCode = queryString!.substringFromIndex(advance(codeContainer!.startIndex, 5))
    // we are advancing 5 characters in order to ignore "code="
}



现在您已经有了代码,是时候使用后端来检索访问令牌了。您可以访问网络服务器吗?如果是,则只需要将上面获得的代码传递给后端,并从后端发起POST请求。 Eventbrite将使用访问令牌响应您,您可以将其存储在后端(推荐)或客户端中。

    method: 'POST',
    url: 'https://www.eventbrite.com/oauth/token',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: {
      'client_id' : '*******',
      'client_secret' : '********',
      'grant_type' : 'authorization_code',
      'code' : CODE_RECEIVED_FROM_ABOVE
    }


如果您无权访问Web服务器,则可以尝试Parse.com。

09-26 09:05