Swift:Twitter仅限应用程序身份验证

时间:2017-12-04 17:25:36

标签: swift authentication twitter

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

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

阅读Twitter的文档我理解为了使用Rest服务我必须对我的应用进行身份验证,因此我已经注册了应用程序并使用“只读”选项请求访问令牌,并在此处启动问题。

每次我将“身份验证错误”作为回复时,我都无法访问Rest服务。

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

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

  1. 对消费者密钥和秘密进行编码
  2. 获取持有人令牌
  3. 使用持票人令牌验证API请求
  4. 我在这里寻找解决方案:

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

    这是我的尝试:

    1。首先,我创建了func来编码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)

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

    有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

使用它:

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)