【问题标题】:Swift : Twitter Application-Only AuthenticationSwift:Twitter 仅应用程序身份验证
【发布时间】:2018-05-18 05:39:42
【问题描述】:

我正在构建一个应用,其中包含对我所在城市的某些商店的引用。 现在我想在每个商店的详细视图中插入一个表格,其中包含来自商店帐户的最后 3 或 5 条推文。

我不想使用第三方解决方案。

阅读 Twitter 的文档后,我了解到要使用 Rest Services,我必须对我的应用程序进行身份验证,因此我已经注册了该应用程序并使用“只读”选项请求了访问令牌,然后从这里开始解决问题。

每次我收到“身份验证错误”作为响应时,我都无法访问 Rest 服务。

Twitter 网站上的文档在这里: https://developer.twitter.com/en/docs/basics/authentication/overview/application-only

其中描述了仅应用程序身份验证的三个步骤:

  1. 对消费者密钥和秘密进行编码
  2. 获取不记名令牌
  3. 使用不记名令牌验证 API 请求

我在这里寻找解决方案:

然后在谷歌上我发现了这个: http://rshankar.com/retrieve-list-of-twitter-followers-using-swift/

这是我的尝试:

1.首先我创建了函数来编码 consumer_key 和 consumer_secret

    let consumerKey = "xxxxxxxxxxxxxxxx"
    let consumerSecret = "xxxxxxxxxxxxxxxx"
    let authUrl = "https://api.twitter.com/oauth2/token"

    func getBase64EncodeString() -> String {
        let consumerKeyRFC1738 = consumerKey.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
        let consumerSecretRFC1738 = consumerSecret.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
        let concatenateKeyAndSecret = consumerKeyRFC1738! + ":" + consumerSecretRFC1738!
        let secretAndKeyData = concatenateKeyAndSecret.data(using: String.Encoding.ascii, allowLossyConversion: true)
        let base64EncodeKeyAndSecret = secretAndKeyData?.base64EncodedString(options: NSData.Base64EncodingOptions())
        return base64EncodeKeyAndSecret!
    }

2。然后func获取bearerToken

    func getBearerToken(completion:@escaping (_ bearerToken: String) -> Void) {
    var request = URLRequest(url: URL(string: authURL)!)
    request.httpMethod = "POST"
    request.addValue("Basic " + getBase64EncodeString(), forHTTPHeaderField: "Authorization")
    request.addValue("application/x-www-form-urlencoded;charset=UTF-8", forHTTPHeaderField:"Content-Type")
    let grantType = "grant_type=client_credentials"
    request.httpBody = grantType.data(using: String.Encoding.utf8, allowLossyConversion:  true)
    URLSession.shared.dataTask(with: request, completionHandler: { (data: Data?, response:URLResponse?, error: NSError?) -> Void in
        do {
            if let results: NSDictionary = try JSONSerialization .jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments  ) as? NSDictionary {
                if let token = results["access_token"] as? String {
                    completion(token)
                } else {
                    print(results["errors"]!)
                }
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
        } as! (Data?, URLResponse?, Error?) -> Void).resume()
}

3.最后使用不记名令牌验证 API 请求

    func getResponseForRequest(url:String) {
      var results:NSDictionary
      getBearerToken(completion: { (bearerToken) -> Void in
        var request = URLRequest(url: URL(string: url)!)
        request.httpMethod = "GET"
        let token = "Bearer " + bearerToken
        request.addValue(token, forHTTPHeaderField: "Authorization")
        URLSession.shared .dataTask(with: request, completionHandler: { (data: Data?, response:URLResponse?, error: NSError?) -> Void in
            self.processResult(data!, response: response!, error: error)
            } as! (Data?, URLResponse?, Error?) -> Void).resume()
    })
}

目前我有一条消息错误:

    } as! (Data?, URLResponse?, Error?) -> Void).resume()

在 getBearerToken 函数中。

错误信息是:

线程 1:EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

所以直到我没有验证身份验证是否有效。

有人可以帮我吗?

【问题讨论】:

  • 嗨,你解决了这个问题吗?我也有同样的问题。
  • 不,我还在寻找解决方案
  • 我修复了这个问题并在下发布了解决方案

标签: swift authentication twitter


【解决方案1】:

使用这个:

var request = URLRequest(url: url)
    request.httpMethod = HttpMethod.POST.rawValue
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.addValue("Basic \(base64)", forHTTPHeaderField: "Authorization")
    request.httpBody = "grant_type=client_credentials".data(using: .utf8)

【讨论】:

  • 很好,非常感谢,我会尽快尝试您的解决方案
  • 我在 facebook 上遇到了同样的问题,你有没有试过或有什么建议?
  • 不,但我认为这是同样的问题,只是http头设置错误。
猜你喜欢
  • 2015-06-10
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2013-04-29
  • 1970-01-01
  • 2018-12-23
  • 2012-11-23
相关资源
最近更新 更多