質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1480閲覧

Swift から API をコールしたときに JWTトークンの認証が通らない

nerianighthawk

総合スコア544

JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/06/25 08:11

編集2020/06/29 08:29

前提・実現したいこと

Swift から JWTトークン認証を使ったAPIをコールしたいです。
認証の必要がないAPIはコールできますが、認証が必要なAPIのコールで401が返ってきてしまう状況です。
よろしくお願いします。

発生している問題・エラーメッセージ

Status Code 401 が返ってきて、サーバサイドのエラーも Unauthorized というメッセージを吐いています。

該当のソースコード

swift

1let url = URL(string: HOST + urlString) 2 3var request = URLRequest(url: url!) 4request.httpMethod = "GET" 5request.addValue("application/json", forHTTPHeaderField: "Content-Type") 6if let key = store.key { 7 request.addValue("JWT " + key.token, forHTTPHeaderField: "Authorization") 8} 9 10print(request.allHTTPHeaderFields) 11 12let task: URLSessionTask = URLSession.shared.dataTask(with: request) {(data, response, error) in 13 // 何かしらの実装 14} 15 16task.resume()

以下のように、ヘッダにトークン情報はちゃんと入っていました。

Optional(["Content-Type": "application/json", "Authorization": "JWT //トークン情報"])

試したこと

同じトークンを使って、 Chrome 拡張の API Tester で呼び出した場合はレスポンス 200 で、ちゃんと呼び出すことができました。

問題の切り分けのため、ncコマンドを使ったデバックを行いました。
また、その際、キーを hoge、値を fuga としたヘッダを追加したところ、こちらはヘッダに追加されていました。

$ nc -l 8000 GET {URL} HTTP/1.1 Host: localhost:8000 Content-Type: application/json hoge: fuga Accept: */* User-Agent: {クライアントエージェント名} Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: keep-alive

他にも、Accept キーは通常通り書き換えが行えたため、本当に Authorization キーのみが弾かれている状態です。
ここまで来ると、Xcodeの設定の問題なのかなとも思うのですが、調べても見つかりません。よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

バージョン情報
Xcode: 11.5
Swift: 5.2.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nerianighthawk

2020/06/30 08:52

現象としてはかなり当てはまっているように思えます。 いただいたドキュメントには直接指定するなという記載があるのですが、どのようにすればいいか等のアイデアはありますでしょうか。
hoshi-takanori

2020/06/30 08:58

それが、手元では動いちゃったので、よく分からないんですよね…。 ちなみに、質問文のコードで url = "http://localhost:8000/"、token = "SECRET_TOKEN" として express で適当に書いた API を叩いて req.headers を表示させたら、以下のように出ました。 { host: 'localhost:8000', accept: '*/*', 'content-type': 'application/json', connection: 'keep-alive', 'accept-language': 'en-us', authorization: 'JWT SECRET_TOKEN', 'accept-encoding': 'gzip, deflate', 'user-agent': 'AuthApp/1 CFNetwork/1126 Darwin/19.5.0' }
hoshi-takanori

2020/06/30 09:14 編集

URL に / がないせいでリダイレクトされて、その際に Authorization が消される場合があるようです。(nc での実験結果を見る限り、そういう問題ではない気もしますが、ご参考まで。) https://stackoverflow.com/a/46332804/1019868 あと、サーバーに手を入れられるなら X-Authorization に (も) するとか? (セキュリティ上問題がないかどうかは知りません。) https://stackoverflow.com/a/39680437/1019868
nerianighthawk

2020/06/30 13:23

一通り可能性を上げていただき、ありがとうございます。 とてもお恥ずかしいのですが、最後に / がないというのが正解でした。 言い訳みたいですが、サーバ側の実装で / がない場合はURL不一致として、404を返すのが想定されていたので、まさかクライアント側でURLをリダイレクトした上にヘッダを消すような処理が入っているとは思いませんでした。 もしよろしければ、回答として記載していただければベストアンサーとして選ばせていただきます。 本当にありがとうございました。
guest

回答1

0

ベストアンサー

URL に / がないせいでリダイレクトされて、その際に Authorization が消される場合があるようです。
参考: https://stackoverflow.com/a/46332804/1019868

投稿2020/06/30 19:48

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問