質問編集履歴

3

コードの間違いを修正した。

2019/06/23 11:56

投稿

tadanoosakana
tadanoosakana

スコア30

test CHANGED
File without changes
test CHANGED
@@ -370,9 +370,9 @@
370
370
 
371
371
  val expected = "長いので略"
372
372
 
373
- val actual = "長いので略
373
+ val actual = "長いので略"
374
-
374
+
375
- val lastIndex = min(data.length, signatureBaseString.length)
375
+ val lastIndex = min(expected.length, actual.length)
376
376
 
377
377
 
378
378
 

2

追記をもう一つ追加した。

2019/06/23 11:56

投稿

tadanoosakana
tadanoosakana

スコア30

test CHANGED
File without changes
test CHANGED
@@ -405,3 +405,55 @@
405
405
  この情報をもとにもう一度実装し直してみます。
406
406
 
407
407
  ページに大文字小文字についての言及があったのかもしれないので。
408
+
409
+
410
+
411
+ ## 追記2
412
+
413
+ `Hello Ladies + Gentlemen, a signed OAuth request!`をパーセントエンコードすると`Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21`になると思いますが、
414
+
415
+
416
+
417
+ [Creating a signature — Twitter Developers](https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature.html)
418
+
419
+
420
+
421
+ では`Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21`として扱われているように思えます。
422
+
423
+ `+`が`%2B`に変換されるはずですが、このページでは`%2b`として扱われています。
424
+
425
+ また、`,`も`%2C`に変換されるはずですが、`%2c`として扱われています。
426
+
427
+
428
+
429
+ しかし、[Creating a signature — Twitter Developers](https://developer.twitter.com/en/docs/basics/authentication/guides/creating-a-signature.html) で実際のシグネチャを求めていく解説の中では、正しい値である大文字のBと大文字のCの方として扱っているため、実行結果が異なるといったことにつながったのではないかと思います。
430
+
431
+
432
+
433
+ 試しに、入力を修正して私のプログラムを実行してみました。
434
+
435
+ `"status" to "Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21"` を
436
+
437
+ `"status" to "Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21"` に直して実行すると、
438
+
439
+
440
+
441
+ ```Text
442
+
443
+ key: kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE
444
+
445
+ data: POST&https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521
446
+
447
+ signature: hCtSmYh+iHYCEqBWrE7C7hYmtUk=
448
+
449
+ 正しい結果が得られました。
450
+
451
+ ```
452
+
453
+
454
+
455
+ というように正しく動作したように思えます。
456
+
457
+
458
+
459
+ この「解説ページが間違っている」という推測が正しいという裏付けが取れませんので、何か情報を持ってらっしゃる方は教えてください。

1

追記を追加した。

2019/06/23 01:19

投稿

tadanoosakana
tadanoosakana

スコア30

test CHANGED
File without changes
test CHANGED
@@ -355,3 +355,53 @@
355
355
  }
356
356
 
357
357
  ```
358
+
359
+
360
+
361
+ # 追記
362
+
363
+ 次のコードで検証して見ると、大文字小文字が違っていました。
364
+
365
+ 公式ページの値と比較する際にChromeの検索機能 (大文字小文字を区別しない) で比較していたので気づきませんでした。
366
+
367
+
368
+
369
+ ```Kotlin
370
+
371
+ val expected = "長いので略"
372
+
373
+ val actual = "長いので略
374
+
375
+ val lastIndex = min(data.length, signatureBaseString.length)
376
+
377
+
378
+
379
+ for (i in (0..lastIndex)) {
380
+
381
+ val actualChar = actual[i]
382
+
383
+ val expectedChar = expected[i]
384
+
385
+ if (actualChar != expectedChar)
386
+
387
+ println("$i: $actualChar, $expectedChar")
388
+
389
+ }
390
+
391
+ ```
392
+
393
+
394
+
395
+ ```Text
396
+
397
+ 388: b, B
398
+
399
+ 407: c, C
400
+
401
+ ```
402
+
403
+
404
+
405
+ この情報をもとにもう一度実装し直してみます。
406
+
407
+ ページに大文字小文字についての言及があったのかもしれないので。