シングルサインオン(SSO)仕様と実装ガイド¶
- 対応バージョン: learningBOX 2.5.2 以降
- プロトコル: HTTPS
- ドメイン: お客様の運用ドメイン(例: lms.learningbox.online)
- HTTPメソッド: GET, POST(action=sso 以外のパラメータは POST を推奨)
- エンドポイント: https://{tenant-domain}/?action=sso
概要¶
- 利用用途: learningBOX へのログインを行います。
- エンドポイント:
?action=sso - メソッド: GET/POST(セキュリティとURL長、Referrer露出抑止の観点から、action 以外は POST 推奨)
- 備考: リクエストパラメータが複数設定されている場合は AND 検索(評価)となります。
必須パラメータ¶
- login: ログインID(string)
- 使用可能文字: 半角英数字、および次の記号のみ利用可
! " # $ % & ' ( ) * + , - . / : ; < = > ? [ ] ^ _
- 上記以外の文字を使用した場合は利用不可(SSO Error 224 が表示されます)
-
例:
tatsuno-user1 -
sco_id: 教材(またはフォルダ)内部ID(number)
- ログインのみを行いたい場合は 0 を指定
-
例:
0 -
sco_code: コンテンツコード(string, 任意)
- ログイン先のフォルダ・教材のコンテンツコードです
- ログインだけ行いたい場合は 指定しないでください
-
sco_id=0 の場合のみ有効
-
time: 現在時刻(UNIX タイム, 秒)
-
例:
1542088980 -
key: ログイン認証キー(string)
- 生成式:
sha256(login + "/" + secret + "/" + sco_id + "/" + time)(PHPサンプルでは.は文字列連結) - PHP例:
$key = hash('sha256', $login.'/'.$secret.'/'.$sco_id.'/'.$time);
レスポンス¶
- 正常(302 Found)
- sco_id=0 の場合: マイページ
/sys/index.phpへリダイレクト - sco_id=フォルダ の場合: 学習画面
/sys/index.php?action=courseAll¤t-folder={sco_id}へリダイレクト - sco_id=コンテンツ の場合: 受講画面(例
/sys/index.php?action=quizPlayer&options=...)へリダイレクト urlが指定されている場合:/sys/?action=courseAll等、指定の遷移先へリダイレクト-
パラメータ不足時: トップ画面
/index.phpへリダイレクト -
異常(エラー)
- DBエラー: HTTP 500 としてエラーメッセージ出力
- 400系に相当するパラメータエラー
- 既存アカウントにログインする際のパラメータエラー
- アカウント登録時のパラメータエラー
実装例(補足)¶
以下は仕様に基づく参考実装コードです。環境に合わせて調整してください。
GET の URL 生成(PHP)¶
<?php
declare(strict_types=1);
$endpoint = 'https://{tenant-domain}/'; // 末尾スラッシュ維持
$login = 'user-123';
$sco_id = 0; // ログインのみは 0
$time = time();
$secret = 'YOUR_SHARED_SECRET';
$key = hash('sha256', $login . '/' . $secret . '/' . $sco_id . '/' . $time);
$params = [
'action' => 'sso',
'login' => $login,
'sco_id' => $sco_id,
'time' => $time,
'key' => $key,
// 'sco_code' => 'QUIZ001', // sco_id=0 のときのみ有効
// 'url' => '/sys/?action=courseAll', // 任意
];
$query = http_build_query($params, '', '&', PHP_QUERY_RFC3986);
header('Location: ' . $endpoint . '?' . $query);
exit;
POST のフォーム送信(PHP cURL)¶
<?php
declare(strict_types=1);
$endpoint = 'https://{tenant-domain}/';
$login = 'user1';
$sco_id = 0;
$time = time();
$secret = 'YOUR_SHARED_SECRET';
$key = hash('sha256', $login . '/' . $secret . '/' . $sco_id . '/' . $time);
$post = [
'login' => $login,
'sco_id' => $sco_id,
'time' => $time,
'key' => $key,
// 任意フィールドは必要に応じて追加
];
$ch = curl_init($endpoint);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($post, '', '&', PHP_QUERY_RFC3986),
CURLOPT_HEADER => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
]);
$res = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
echo "HTTP Status: {$info['http_code']}\n";
if (preg_match('/^Location:\s*(.+)$/mi', $res, $m)) {
echo "Redirect To: " . trim($m[1]) . "\n";
}
POST(HTMLフォーム例)¶
<form method="post" action="https://{tenant-domain}/">
<input type="hidden" name="login" value="user1" />
<input type="hidden" name="sco_id" value="0" />
<input type="hidden" name="time" value="1657896543" />
<input type="hidden" name="key" value="e3b0c4..." />
<button type="submit">SSO でログイン</button>
</form>
注意¶
- 署名キー生成は「login/secret/sco_id/time」をそのままスラッシュで連結し、余分な空白を混入させないこと
- GET はURLやログに露出しやすいため、POST を推奨