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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Swift

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

Q&A

1回答

2896閲覧

とあるAPIの認証が通らない

mantohihi

総合スコア11

Swift

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

0グッド

0クリップ

投稿2017/02/05 05:16

###前提・実現したいこと
swift3のコーディングで詰まっているので教えてください。
xcode10 swift3で、とあるprivae APIにapi_kyeとシークレットキーで接続を試みていますが。
{"success": 0, "error": "signature mismatch"}となり通りません。
下記のコードですが、swift3とapi接続をお分かりの方にとっては
ソースと下記のapi資料を見るだけでわかる問題かもしれません。

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

{"success": 0, "error": "signature mismatch"}

###該当のソースコード

swift

1 2 3import Alamofire 4import SwiftyJSON 5import HashKit 6 7 func test () { 8 9 10 let params = [ 11 "nonce":String(Int(Date().timeIntervalSince1970)), 12 "method":"get_info"] 13 14 let sign:String = String(describing: params).hmac(algorithm: .sha512, key:api_secret_key)! 15 16 17 let headers = [ 18 "Key":api_key, 19 "Sign":sign] 20 21 Alamofire.request("https://api.zaif.jp/tapi" , method: .post, parameters: params, encoding: JSONEncoding.default, headers:headers) 22 //.responseJSON { response in 23 .responseString { response in 24 let wdic = JSON(response.result.value as Any) 25 print("output:",wdic) 26 27 28 } 29 30 }

###試したこと
課題に対してアプローチしたことを記載してください

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

  • 環境

swift3系/Version 8.2.1 (8C1002)/macos sierra 10.12.2 (16C68)

  • 接続先API

https://corp.zaif.jp/api-docs/trade-api/#method_get_info

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

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

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

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

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

guest

回答1

0

swiftはわからないので恐縮ですが

"error": "signature mismatch"

と、あるので signatureが違うと言われていて 仕様を見ると

Sign – POSTする全てのパラメータ(nonceとmethodおよびメソッド毎のパラメータ)をURLエンコードしたクエリ形式(param1=val1&param2=val2)のメッセージとして、Secret Keyを用いてHMAC-SHA512で署名します

とあります。コードを見ると

let sign:String = String(describing: params).hmac(algorithm: .sha512, key:api_secret_key)!

となっていて クエリ形式への変換が抜けている気がしますがどうでしょう?

投稿2017/02/05 05:50

cordovaonsen

総合スコア38

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

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

mantohihi

2017/02/05 06:36

アドバイスありがとうございます。parametersに渡すparamsを URLクエリにして「nonce=xxxxxxxxxx&method=get_info」をSecret Keyを用いてHMAC-SHA512で署名ということで進めましたが、未だに通りません。何か考えれる部分あるでしょうか? メッセージは"error": "signature mismatch"です。 ```Swift let nonce = String(Date().ticks) let params = ["nonce":nonce,"method":"get_info"] let targetURL = "nonce=" + nonce + "&" + "method=get_info" let encodedURL = targetURL.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) let sign:String = encodedURL!.hmac(algorithm: .sha512, key:api_secret_key)! let headers = [ "Key":api_key, "Sign":sign] Alamofire.request("https://api.zaif.jp/tapi" , method: .post, parameters: params, encoding: JSONEncoding.default, headers:headers) .responseString { response in let wdic = JSON(response.result.value as Any) print("output:",wdic) } ```
cordovaonsen

2017/02/05 11:30

> nonce=xxxxxxxxxx&method=get_info これ全体をURLエンコードするのではなく キー(nonce,method)とバリュー(xxxxxxxxxx,get_info)だけ URLエンコードだと思うのですが いかがでしょう? (nonce,methodはURLエンコードしても そのままなので 何もしなくても良いですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問