使用iOS / swift验证OAuth2和Eventbrite时出现“糟糕,出错”错误

时间:2015-08-21 19:49:25

标签: ios swift oauth-2.0 eventbrite

我正在尝试使用iOS / swift验证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 App设置: 申请网址:http://mywebsite.com OAuth Redirect Uri:oauth-swift:// oauth-callback / eventbrite

如何将用户重定向到我的应用,以便检索访问令牌?当我尝试验证w Eventbrite时会调用app delegate / openURL函数(当我尝试使用Foursquare和Instagram时会调用它)。此外,我尝试了Foursquare和Instagram的OAuth2,它工作正常。

我是否遗漏了某些特定于OAuth2 w eventbrite w.r.t我的应用设置,代码等?感谢

1 个答案:

答案 0 :(得分:1)

在iOS中使用OAuth时要小心谨慎:

  1. 如果您计划在App Store中分发您的应用,请确保您不使用Safari进行身份验证。您必须在您的应用程序中执行此操作,最好的位置是使用WebView。
  2. 切勿将您的应用/消费者秘密存储在iOS应用中。
  3. 现在,如何通过WebView实现OAuth身份验证?

    1. 如果您使用的是故事板,请将WebView拖入ViewController。还要为ViewController创建一个类文件,并为WebView创建一个IBOutlet。
    2. 在ViewController的viewDidAppear功能上设置WebView加载授权网址。

      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)!))
      
    3. UIWebViewDelegate协议添加到ViewController并添加函数webViewDidFinishLoad(webView: UIWebView)。只要WebView完成加载页面,就会调用此函数。
    4. 一旦用户提供对您应用的访问权限,Eventbrite会将您重定向到您提供代码的重定向。例如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="
      }
      
    5. 现在您已经获得了代码,是时候使用后端来检索访问令牌了。你有权访问网络服务器吗?如果是,您只需将上面获得的代码传递给后端,并从后端发起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。