Multipassによる顧客ログインの有効化
Multipassでのログインは、別のウェブサイトとSHOPLINEストアを持つストアオーナー向けに設計されています。これは顧客をウェブサイトからSHOPLINEストアにリダイレクトし、元のサイトで使用するのと同じメールアドレスでシームレスにログインさせます。もしアカウントが紐付けられていない、または作成されていない場合は新しいアカウントも作成されます。顧客データベースの同期が不要であることも相まって、このアプリはユーザーに大きな利便性をもたらします。
この記事では、Multipassとは何か、その使い方、およびセキュリティ機能について説明します。
Multipassの使い方
SHOPLINEでのMultipassログインの有効化
- SHOPLINE管理画面から、設定 > 顧客アカウント > 顧客アカウントタイプに移動します。クラシック顧客アカウントが選択されていることを確認してください。クラシック顧客アカウントセクション > Multipassでログイン > 編集に進み、有効にするをクリックします。
- 有効化すると、「暗号化キー」が発行されます。このキーは顧客がストアにログインするためのトークンを生成する際に必要です。キーは安全に保管してください。
顧客情報のJSON形式へのエンコード
顧客情報はハッシュ値として表現され、少なくとも顧客のメールアドレスと現在のタイムスタンプ(ISO8601参照)を含む必要があります。顧客の名前(名、姓)、複数の配送先住所、または顧客の現在のブラウザセッションの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フィールドを使用してください。
|
注意事項: SHOPLINEでは、Multipassログインにおいてメールアドレスを顧客の一意の識別子として使用します。SHOPLINEに顧客を登録する際、以下の場合には識別子フィールドに一意の識別子を設定する必要があります:
メールアドレスが常に一意である場合、識別子フィールドは不要です。特定のメールアドレスは、1つのSHOPLINE顧客アカウントの登録にのみ使用できます。異なる「識別子」であっても別のアカウントの登録に使用すると、エラーが発生します。 |
JSONデータのAES暗号化
有効なmultipassログイントークンを生成するには、SHOPLINE管理画面で提供されるキーが必要です。このキーは2つの暗号鍵(暗号化用と署名用)を導出するために使用されます。この鍵の導出はSHA-256ハッシュ関数を用いて行われ(最初の128ビットが暗号化鍵、最後の128ビットが署名鍵として使用されます)。
暗号化は機密性を提供し、誰も顧客データを読むことができないようにします。暗号化鍵(128ビット、CBCモード、ランダム初期化ベクター)はAESアルゴリズムによって生成されます。
HMACを使用した暗号化データの署名
署名(メッセージ認証コードとも呼ばれます)は真正性を提供します。これにより、Multipassトークンが正当で改ざんされていないことが保証されます。暗号化されたJSONデータ(平文のJSONデータではなく)に対して、SHA-256のHMACアルゴリズムを用いて署名が行われます。
Base64を使用したバイナリデータのエンコード
Multipassログイントークンは128ビットの初期化ベクター、可変長の暗号文、256ビットの署名(ここに記載した順序)で構成されます。これらはBase64(RFC 4648に記載されたURLセーフアルファベット)でエンコードされます。
顧客をSHOPLINEストアへリダイレクトする
トークンを取得したら、HTTP GETリクエストはあなたのSHOPLINEストアへリダイレクトされます。
HTTP GETリクエスト: api/user/account/login/multipass/insert_token_here
リクエストが成功した場合(例えば、トークンが有効で期限切れでない場合)、顧客はあなたのSHOPLINEストアにログインします。
トークンは短期間のみ有効で一度しか使用できないため、事前にトークンを生成しないでください。そうしないとリクエストはHTMLウェブサイトにリダイレクトされます。リダイレクトURLを作成し、必要に応じてトークンを生成することで、ブラウザを通じてリクエストが自動的にストアへリダイレクトされるようにしてください。
実装例
以下はJavaでトークンを生成する基本的な例です:
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(“email”, “peter@shoplineapp.com”);
dataMap.put(“created_at”, createAt);
final String dataJson = “...”; //json string from dataMap;
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 hash
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));
// encrypt byte array
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);
// sign byte array, 256 bit
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フィールドを常に設定し、指定されたブラウザのみがトークンを使用できるようにすることを推奨しています。また、トークンをブラウザに送信する際には、安全なHTTPS接続を使用することを推奨しています。
メインのウェブサイトで新しいアカウントを登録する際には、使用されるメールアドレスの検証を必ず行うようにしてください。そうしないと、アカウントのセキュリティが損なわれる可能性があります。
よくある質問
大量の顧客データベースがあります。SHOPLINEと同期して、Multipassでログインできるようにするにはどうすればよいですか?
何も同期する必要はありません。Multipassでログインして顧客のリクエストをリダイレクトすると、(以前にアカウントが作成されていなければ)顧客のアカウントが自動的にSHOPLINEストアに作成されます。
すでにSHOPLINEで注文をした顧客がいます。これらの顧客情報を更新して、Multipassでログインできるようにするにはどうすればよいですか?
顧客の multipass_identifier を設定するには、顧客APIをご利用ください。 この識別子は、これらの顧客アカウントでのすべてのMultipassログインリクエストに必要です。
キーが漏洩しました。どうすればよいですか?
キーが漏洩した場合は、ストアの管理者ページで無効にすることができます。再度有効にすると新しいキーが生成されます。これにより、元のすべてのURLは無効になります。キーを知っている人は誰でもそのキーを使って顧客アカウントでストアにアクセスできるため、できるだけ早くキーを無効にしてください。
SHOPLINEストア間でMultipassログインを使用できますか?
いいえ、Multipassは外部ウェブサイトへのリダイレクトなしに複数のShopifyストア間でのログインには使用できません。
Multipassログインは卸売チャネルに適用されますか?
いいえ、Multipassログインは卸売チャネルでは使用できません。
remote_ipフィールドはIPv6アドレスに対応していますか?
いいえ、IPv4アドレスのみ対応しています。remote_ipの値が顧客データのハッシュ値に指定されたIPアドレスと一致しない場合、Multipassログインは「Multipassでログインする権限がありません」というエラーを返します。
この記事はAIを使用して翻訳されており、不正確な箇所が含まれている可能性があります。最も正確な情報については、元の英語版をご参照ください。