2017-12-04 9 views
0

私の都市の一部のショップへの参照を含むアプリケーションをビルドしています。 ここでは、各ショップの詳細ビューにショップのアカウントから最後の3つまたは5つのツイートが入ったテーブルを挿入します。Swift:Twitterアプリケーションのみの認証

私はサードパーティのソリューションを使用しません。

私は、Restサービスを使用するために私のアプリケーションを認証する必要があることを理解しているので、私はそのアプリケーションを登録し、アクセストークンに "読み取り専用"オプションを要求しています。

レスポンスとして「認証エラー」が発生するたびに、Restサービスにアクセスすることができません。

Twitterのウェブサイト上のドキュメントはここにある: アプリケーションのみの認証のための3つの手順を説明しているhttps://developer.twitter.com/en/docs/basics/authentication/overview/application-only

  1. エンコードコンシューマキーと
  2. 秘密は、トークン
  3. ベアラを入手します
  4. ベアラトークンでAPIリクエストを認証する
その後、Googleで私は、この発見

  • Access Twitter using Swift
  • Twitter Friendship/create api asking for authentication in swift
  • Parsing Twitter API Search Response in Swift with TwitterKit

    は、私はここで解決策を探しました http://rshankar.com/retrieve-list-of-twitter-followers-using-swift/

    を、これは私の試みです:

    1.私は、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要求を認証するためにCONSUMER_KEYをエンコードし、

    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をconsumer_secretするFUNCを作成し、すべての最初のベアラトークン付き

    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() 
        }) 
    } 
    
    012516410 getBearerTokenのFUNCで

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

    :現時点で

    iは、メッセージ行でエラーが発生しています。

    エラーメッセージがある:

    スレッド1:EXC_BAD_INSTRUCTION(コード= EXC_I386_INVOP、サブコード= 0x0の)認証動作する場合、私は確認していないのでまで

    誰かが私を助けることができますか?

+0

こんにちは、あなたはこの問題を解決しましたか?私は同じ問題を抱えています。 – shilei365

+0

いいえ、私はまだ解決策を探しています –

+0

私はこの問題を解決し、 – shilei365

答えて

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) 
+0

の下にソリューションを投稿しました。ありがとう、あなたの解決策をできるだけ早く試してみます –

+0

私はFacebookのための同じprolblemを持って、これまでトライしたり、何か提案がありますか? –

+0

いいえ、でも同じ問題だと思いますが、httpヘッダーが正しく設定されていません。 – shilei365

関連する問題