きっかけ
REST APIをつくる際、クエリに適正なトークンを渡してもらうことで認可を実装することがあると思います。
クエリに渡すからURLセーフなトークンにすべきですね。
つくりかた
トークンの作り方もいろいろあると思いますが、ユーザーIDなど、ユーザーを識別するための文字列を暗号化したものを返すというのがひとつあげられます。暗号化したものそのままだと、大体は+などのURLの予約語などが含まれてしまって、いけてないです。
というわけで、以下の手順でURLセーフなものをつくります。(あたりまえと言えばあたりまえですが・・・)
- トークンのもととなるものを暗号化
- 上記をURLセーフになるようBase64でエンコード
String userId = "123"; // トークンのもと
String encrypted = encrypt(userId); // 何かで暗号化
String urlSafe = Base64.encodeBase64URLSafeString(encrypted.getBytes());
そうすると、復号化の手順は次のようになります。
- Base64でデコード
- 上記を復号化
byte[] decoded = Base64.decodeBase64(token); //トークンをBase64デコード
String decrypted = decrypt(new String(decoded)) // 文字列にして復号化処理
JSON Web Token
署名できるURLセーフなトークンをつくる仕組みとして、JSON Web Tokenがあります。
どういう使い方ができるかは、下記の記事が参考になります。