2017-06-30 11 views
3

私が使用しているバックエンドAPIでは、HTTPヘッダーキーAuthorizationに対してすべての要求とと​​もにトークンを送信する必要があります。Token xxxxxxxxxxURLSessionのHTTPヘッダーで「承認」に「トークンxxxxxxxxxx」を設定する方法

今、私は次のことを行っています。

var getRequest = URLRequest(url: url) 
getRequest.addValue("Token xxxxxxxx", forHTTPHeaderField: "Authorization") 

これはときどき動作し、要求が送信されたときにヘッダーフィールドAuthorizationが削除されます。私はチャールズプロキシを使ってこれをチェックした。

Apple's documentationは以下のように述べています。

NSURLSessionオブジェクトは、 HTTPプロトコルのさまざまな側面を処理するように設計されています。その結果、あなたは 次のヘッダー変更しないでください。この解決策として認可、接続、ホスト、WWW認証

を、多くの人がURLSessionためdidReceiveAuthenticationChallengeデリゲートメソッドを使用することをお勧め。

ここでURLSession.AuthChallengeDispositionインスタンスを渡して、チャレンジにどのように応答するかを指定し、URLCredentialインスタンスが認証チャレンジに応答するために認証情報を渡す必要があります。

URLCredentialインスタンスを作成して、ヘッダフィールドAuthorizationToken xxxxxxxxを追加する方法を知りません。

もっと知りたい方は、これを解決する方法を教えてください。

PS - この質問に記載されているすべてのコードはSwift 3にあります。 This questionは私のものに似たものを求めています。しかし、そこに与えられた答えは私のために働かない。 AppleがAuthorizationのヘッダーを追加することを許可していないという質問の下で質問された質問のいくつかには、回答がなくなっています。

編集:

関連するコードを掲載しています。

var getRequest = URLRequest(url: url) 
getRequest.httpMethod = "GET" 
getRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") 
getRequest.addValue("application/json", forHTTPHeaderField: "Accept") 
let token = DataProvider.sharedInstance.token 
getRequest.addValue("Token \(token)", forHTTPHeaderField: "Authorization") 
let getTask = URLSession.shared.dataTask(with: getRequest) { (data, response, error) in 
     if let data = data { 
      print("--------GET REQUEST RESPONSE START--------") 
      print("CODE: \((response as? HTTPURLResponse)?.statusCode ?? 0)") 
      print("Response Data:") 
      print(String(data: data, encoding: .utf8) ?? "") 
      print("--------GET REQUEST RESPONSE END--------") 
     } 
} 
getTask.resume() 

ここで、「承認」のヘッダーフィールドがリクエストのヘッダーディクショナリに追加されていることが確認できます。

しかし、どのリクエストがサーバーにヒットしたかを確認すると、「Authorization」のヘッダーフィールドが表示されません。何かご意見は?

+1

'request.addValue(value、forHTTPHeaderField:key)'は私の経験では信頼できます。私はあなたのコードが "問題の状況"での要求に対して呼び出されていないと思う。これを理解するために関連性の高いコードを投稿してください。 – shallowThought

+0

@shallowThought関連コードを追加しました。私がしたことが何か間違っているかどうかを見てください。 –

答えて

3

私はまったく同じ問題に遭遇し、末尾にスラッシュがないことがわかりました。/が問題でした。

サーバーが301 Redirect応答を返送していました。 URLSessionは自動的にリダイレクトに従いますが、Authorizationヘッダーも削除されます。これはおそらくAuthorizationの「特別なステータス」のためです。 URLSessionConfigurationさんdocumentationによると:

URLSessionオブジェクトがあなたのためのHTTPプロトコルのさまざまな側面を扱うように設計されています。その結果、次のヘッダーを変更しないでください。Authorizationヘッダーが必要な場合は

  • 認証
  • 接続
  • ホスト
  • WWW認証

urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)を実装URLSessionTaskDelegateから。このメソッドには、リダイレクトに関する新しい要求が渡され、ヘッダーを追加することができます。

class APIClient: URLSessionTaskDelegate { 
    let session: URLSession! 
    initializeSession() { 
     // Create a new session with APIClient as the delegate 
     session = URLSession(configuration: URLSessionConfiguration.default, 
          delegate: self, 
          delegateQueue: nil) 
    } 

    // Perform the request 
    func fetchRecords(handler:() => void) { 
     var request = URLRequest(url: URL(string: "http://127.0.0.1:8000/api/employee/records")!) 
     request.setValue(retrieveToken(), forHTTPHeaderField: "Authorization") 
     session.dataTask(with: request, completionHandler: handler).resume() 
    } 

    // Implement URLSessionTaskDelegate's HTTP Redirection method 
    func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { 
     // Create a mutable copy of the new request, add the header, call completionHandler 
     var newRequest = request 
     newRequest.addValue(retrieveToken(), forHTTPHeaderField: "Authorization") 
     completionHandler(newRequest) 
    } 
} 

重要なお知らせ!

リダイレクトを盲目的に信頼するのは悪い考えです。リダイレクト先のURLが元のリクエストと同じドメインであることを確認する必要があります。簡潔さのために私のコード例から除外しました。

関連する問題