コンテンツにスキップ

シングルサインオン(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&current-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 を推奨