顧客向けMultipassログイン機能の有効化設定
Multipassログインは、独自のウェブサイトとSHOPLINEストアの両方を運営しているストアオーナー向けに設計された機能です。顧客が独自サイトからSHOPLINEストアにリダイレクトされ、元のサイトで使用しているメールアドレスでシームレスにログインできる仕組みとなっています。すでに連携済みのアカウントがない場合は、自動的に新しいアカウントが作成されます。顧客データベースを同期する必要がないため、スムーズな運用が可能となり、ストアオーナーに大きな利便性をもたらします。
この記事では、Multipassとは何か、その利用方法、およびセキュリティ機能についてご紹介します。
Multipassの使用方法
SHOPLINEでMultipassログインを有効にする
-
SHOPLINE管理画面から、設定 > 顧客アカウント > 顧客のアカウントタイプ に進み、「通常顧客アカウント」 を選択していることを確認します。
その後、通常顧客アカウントセクション内の「Multipassログイン」にある「編集」をクリックし、「有効にする」を選択します。 - Multipassログインを有効にすると、「暗号化キー」が発行されます。
このキーは、顧客がストアにログインするためのトークンを生成する際に必要となるため、安全に保管してください。
顧客情報をJSON形式でエンコードする
顧客情報は、ハッシュ形式で表現され、少なくとも以下の情報を含める必要があります。
- 顧客のメールアドレス(email)
- 現在のタイムスタンプ(ISO8601形式、created_at)
顧客の名前、姓、複数の配送先、または顧客の現在のブラウザセッションのIPアドレスを含めることもできます。
必須項目を含むサンプル:
{
“email”: “peter@shopline.com”,
“created_at”: “2013-04-11T15:16:23-04:00”,
}
オプション項目を含むサンプル:
{
“email”: “peter@shopline.com”,
“created_at”: “2013-04-11T15:16:23-04:00”,
“first_name”: “Peter”,
“last_name”: “jason”,
“tag_string”: “canadian, premium”,
“identifier”: “peter123”,
“remote_ip”: “107.20.160.121”,
“return_to”: “http://yourstore.com/some_specific_site”,
“addresses”: [
{
“address1”: “123 Oak St”,
“city”: “Ottawa”,
“country”: “Canada”,
“first_name”: “Peter”,
“last_name”: “Jason”,
“phone”: “555-1212”,
“province”: “Ontario”,
“zip”: “123 ABC”,
“province_code”: “ON”,
“country_code”: “CA”,
“default”: true
}
]
}
-
tag_string
顧客にタグを付与する場合、カンマ区切りで一語ずつ設定します。この設定は、既存のタグ情報を上書きします。 -
return_to
顧客ログイン後に特定のページへリダイレクトさせたい場合は、return_to
フィールドを使用します。
注:
|
JSONデータのAES暗号化
有効なMultipassログイントークンを生成するには、SHOPLINE管理画面で発行されるキーが必要です。
このキーを元に、暗号化用キーと署名用キーの2つの暗号キーが導出されます。キーの導出にはSHA-256ハッシュ関数が使用され、
- 先頭128ビットが暗号化用キー
- 後半128ビットが署名用キー
として利用されます。
暗号化は顧客データの機密性を確保するために行われます。暗号化にはAESアルゴリズム(128ビット、CBCモード、ランダムな初期化ベクトル(IV))が使用されます。
HMACによる暗号化データの署名
署名(メッセージ認証コードとも呼ばれます)は、データの真正性を保証するために使用されます。
Multipassトークンが正規のものであり、改ざんされていないことを確認するために、暗号化後のJSONデータに対してSHA-256ベースのHMACアルゴリズムを使って署名が行われます。
バイナリデータのBase64エンコード
Multipassログイン用のトークンは、以下の要素で構成されます。
- 128ビットの初期化ベクトル(IV)
- 可変長の暗号化データ(Ciphertext)
- 256ビットの署名(Signature)
これらをこの順番でまとめ、Base64(URLセーフなアルファベット、RFC 4648準拠)でエンコードします。
顧客をSHOPLINEストアにリダイレクトする
トークンが生成されたら、以下の形式でHTTP GETリクエストを送信し、顧客をSHOPLINEストアにリダイレクトします。
HTTP GETリクエスト:api/user/account/login/multipass/insert_token_here
リクエストが成功すると(たとえば、トークンが有効かつ期限切れでない場合)、顧客は自動的にSHOPLINEストアにログインします。
注: トークンの有効期間は短く、1回限りの使用しかできません。あらかじめトークンを生成しておくと、有効期限切れによりリクエストがHTMLページにリダイレクトされてしまう恐れがあります。 |
実装例
以下は、JavaでMultipassログイントークンを生成する基本的な実装例です。
public static void main(final String[] args) throws Exception {
final String createAt = ZonedDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ISO_INSTANT);
final Map<String, String> dataMap = new HashMap<>();
dataMap.put("メールアドレス", "peter@shoplineapp.com");
dataMap.put("created_at", createAt);
final String dataJson = "..."; //dataMapからのJSON文字列
final String secret = "...";
final String token = generateToken(secret, dataJson);
log.info("plaintext={}, token={}", dataJson, token);
}public static String generateToken(final String secret, final String plaintext) throws Exception {
// SHA-256ハッシュ
final MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
final byte[] encodedHash = messageDigest.digest(secret.getBytes(StandardCharsets.UTF_8));
final byte[] encryptedKey = new byte[16];
final byte[] signKey = new byte[16];
System.arraycopy(encodedHash, 0, encryptedKey, 0, 16);
System.arraycopy(encodedHash, 16, signKey, 0, 16);
// iv
final byte[] iv = new byte[16];
new SecureRandom().nextBytes(iv);
final SecretKeySpec encryptedKeySpec = new SecretKeySpec(encryptedKey, "AES");
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, encryptedKeySpec, new IvParameterSpec(iv));
// バイト配列を暗号化
final byte[] encrypted = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
final byte[] ivEncryptedByte = new byte[iv.length + encrypted.length];
System.arraycopy(iv, 0, ivEncryptedByte, 0, iv.length);
System.arraycopy(encrypted, 0, ivEncryptedByte, iv.length, encrypted.length);
final Mac hmac = Mac.getInstance("HmacSHA256");
final SecretKeySpec signKeySpec = new SecretKeySpec(signKey, "HmacSHA256");
hmac.init(signKeySpec);
// バイト配列に署名、256ビット
final byte[] signByte = hmac.doFinal(ivEncryptedByte);
final byte[] tokenBytes = new byte[ivEncryptedByte.length + signByte.length];
System.arraycopy(ivEncryptedByte, 0, tokenBytes, 0, ivEncryptedByte.length);
System.arraycopy(signByte, 0, tokenBytes, ivEncryptedByte.length, signByte.length);
String token = Base64.encodeBase64URLSafeString(tokenBytes);
token = token.replace('+', '-').replace('/', '_');
return token;
}
セキュリティに関する注意事項
SHOPLINEでは、セキュリティ向上のため、顧客データのハッシュ値にremote_ipフィールドを必ず設定することを推奨しています。
これにより、指定されたブラウザのみがMultipassトークンを使用できるようになります。
また、トークンをブラウザに送信する際は、HTTPS接続を使用して安全に通信することを強く推奨します。
さらに、メインサイトで新規アカウント登録を行う際には、必ずメールアドレスの確認(バリデーション)を実施してください。
これを怠ると、アカウントのセキュリティが脅かされるリスクがありますので、ご注意ください。
よくある質問
顧客データベースが大量にあります。Multipassログインを利用するために、SHOPLINEに同期する必要はありますか?
いいえ、同期作業は不要です。Multipassログインを通じて顧客をリダイレクトすると、SHOPLINEストア側で自動的にアカウントが作成されます(既存アカウントがない場合のみ)。
一部の顧客はすでにSHOPLINEで注文をしています。この顧客情報を更新して、Multipassログインを利用できるようにするにはどうすればよいですか?
顧客APIを使用して、対象顧客にmultipass_identifierを設定してください。Multipassログインを行うには、対象アカウントにこの識別子が必要です。
Multipassキーが漏洩してしまいました。どうすればいいですか?
すぐに管理画面で該当キーを無効化してください。無効化後に再度有効化すると、新しいキーが発行されます(既存のURLはすべて無効になります)。キーを知っている第三者が顧客アカウントに不正アクセスできるリスクがあるため、できるだけ早急に対応してください。
複数のSHOPLINEストア間でMultipassログインを利用できますか?
いいえ、Multipassログインは、異なるSHOPLINEストア間で直接利用することはできません。外部サイトを経由するリダイレクトを設定する必要があります。
Multipassログインは卸売チャネルでも利用できますか?
いいえ、Multipassログインは卸売チャネルでは利用できません。
remote_ipフィールドはIPv6アドレスに対応していますか?
いいえ、IPv4アドレスのみ対応しています。remote_ipの値と実際のIPアドレスが一致しない場合、Multipassログイン時に「Multipassログインの権限がありません」というエラーが返されます。