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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

8261閲覧

jsonをbase64でencodeした際、意図した結果になりません。

urbainleverrier

総合スコア200

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/05/22 14:02

###分からないこと
Python2.7でjwtを利用した認証の学習をしています。
base64でjsonデータのデコード、エンコードの処理の違いが分かりません。
最初のコードではbase64でデコードされた一見異なるデータですが、実行すると同じような結果に。
その結果をコピーし、jsonでデコードして、base64でエンコードすると、同じ結果になります。
なぜ、このような結果になるのか分かりません。お忙しいところ恐縮ですが、ご教授頂けると幸いです。

(本来は最後のようなエンコードの結果でなく、最初のソースコードの1で記したようなデータにしたいと思っています。
最初の1のソースコードはJWTのページ(https://jwt.io)から持って参りました。)

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

python

1import base64 2print(base64.urlsafe_b64decode('eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9'))#1 3print(base64.urlsafe_b64decode('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9'))#2

実行結果
{"alg": "HS256", "typ": "JWT"} (1)
{"alg":"HS256","typ":"JWT"} (2)

python

1import base64 2import json 3print(base64.urlsafe_b64encode(json.dumps({ 4 "alg": "HS256", "typ": "JWT" 5}))) #1 6print(base64.urlsafe_b64encode(json.dumps({ 7 "alg":"HS256","typ":"JWT" 8}))) #2 9#jsonの中身のデータは上記の実行結果をコピーしました。

実行結果
eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9 (1)
eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9 (2)
###補足情報(言語/FW/ツール等のバージョンなど)
Python2.7

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問で挙げて頂いたソースコードでは urlsafe_b64decode() に値を引き渡す前に json.dump() を通しております。

その結果

Python

1print(json.dumps({ 2 "alg": "HS256", "typ": "JWT" 3})) 4# => {"alg": "HS256", "typ": "JWT"} 5print(json.dumps({ 6 "alg":"HS256","typ":"JWT" 7})) 8# => {"alg": "HS256", "typ": "JWT"}

となっており、結局どちらも urlsafe_b64decode()には同じ値

{"alg": "HS256", "typ": "JWT"}

を渡しているこいうことになります。
ですので、urlsafe_b64decode()した結果は当然同じ

eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9

が出力されます。

つまりurlsafe_b64decode()json.dump()を通さずに

Python

1print(base64.b64encode('{"alg": "HS256", "typ": "JWT"}')) 2# => eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9 3print(base64.b64encode('{"alg":"HS256","typ":"JWT"}')) 4# => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

のようにすると、従来(ソースコード1)と同じ結果が得られると思います。

投稿2017/05/22 23:28

magichan

総合スコア15898

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

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

urbainleverrier

2017/05/27 07:36

有難うございます。解決できました。
guest

0

最初のコードではbase64でデコードされた一見異なるデータですが、実行すると同じような結果に。

空白文字の有無が違います。
以下でデコード・エンコード結果を確認してみてください。
オンラインBase64でデコーダ

投稿2017/05/22 14:10

can110

総合スコア38256

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

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

urbainleverrier

2017/05/22 14:55 編集

早速のご回答有難うございます。実行してみたところ、確認できました。ですが、後半のコードの実行では、全く同じ結果になってしまうのはどうしてなのでしょうか。私としては、同様のjsonデータをbase64でencodeした際、前半のコードの2で記しているような文字列(eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9)を得たいと思っています。
can110

2017/05/22 23:54

後半はmagichanさんの回答のとおりで、json.dumpsに渡しているデータは、空白有無に関係なく同じ構造のjsonデータとみなされます。よってdumpsで文字列化した結果も同じになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問