既存システムへの Advantech サインインの組み込みや本番運用を行うエンジニア向けです。構成、設定項目、このサイトが提供するライブラリと API、そして自分で開発しなければならない部分を説明します。
サインインは SSO が担当しますが、「誰がサインイン中か」はサイト自身のセッションで決まります。Client Secret はバックエンドにだけ置きます。
| 構成要素 | 場所 | 担当 |
|---|---|---|
| ブラウザー | ユーザーの PC | サインインページ / ボタン / ユーザーバッジを表示 (advantech-sso.js)。サイトの /auth/* だけを呼び、秘密情報は持ちません。 |
| バックエンド | 自分のサーバー | Client Secret を保管し、/auth/login と /auth/callback を処理、自分のセッションを作成・確認し、ページと API を保護します。 |
| Advantech SSO | https://ae-sso.advantech.com | Microsoft サインイン、サービス間シングルサインオン、許可 / 拒否リスト、ユーザー情報と写真、サインイン記録。 |
| Microsoft Entra ID | login.microsoftonline.com | パスワード、MFA、条件付きアクセス。サイトが直接やり取りすることはありません。 |
サイトはまだサインインしていないことに気づきます。
バックエンド (/auth/login) がランダムな確認値 (state) を付けてブラウザーを SSO にリダイレクトします。
SSO はサインイン済みかを確認し、まだなら Microsoft で会社のアカウントとパスワードを入力してもらいます。
SSO は一度だけ使える「チケット」(code) と確認値を付けて、ブラウザーを /auth/callback に戻します。
バックエンドは確認値を照合し、「チケット + Client Secret」で SSO から名前・メール・部署などを受け取ります。この手順はブラウザーから見えないため、シークレットは安全です。
バックエンドはユーザー情報を自分のセッションに保存します。以降のリクエストはセッションを見るだけで、SSO に問い合わせる必要はありません。
advantech-sso.js がサイトの /auth/me を呼んで現在のユーザーを表示します。
ユーザーに実際に見えるのは「サイトを開く → (初回のみ) Microsoft のサインイン画面 → サイトに戻る」だけです。他の手順は数ミリ秒で自動的に終わります。
| 項目 | 必要性 | 説明 |
|---|---|---|
| サービスの追加 | 必須 | Client ID と Client Secret を取得します。サービス担当者は「マイサービス」から申請できます。 |
| Redirect URI | 必須 | 使うアドレスはすべて登録します。本番とローカルは別々に登録します (例: https://myapp.advantech.world/auth/callback と http://localhost:5000/auth/callback)。完全一致が必要です。 |
| このサービスが取得できるデータ | 推奨 | サイトが本当に必要な項目 (部署、上司など) だけを許可します。同じ上司のメンバーと生データは既定でオフです。 |
| データのマスキング | 任意 | 管理者は特定の人の特定の項目を * で隠せます (例: 役員の携帯番号)。項目は残り、各人に masked と masked_fields が付くのでプログラムで判定でき、フロントエンド キットはマスキングされた値を自動で「非表示」と表示します。サインインした本人の自分のデータはマスキングされません。 |
| 許可リスト(許可) / 拒否リスト(禁止) | 任意 | サインインできるアカウントやドメインを制限します。拒否されたユーザーはサイトに到達しません。 |
| ユーザー・グループ API デバイス | 任意 | 誰もサインインしていない状態でサーバーがユーザーを照会する場合 (バッチ、同期) のみ。最高管理者がオンにしてデバイスを登録します。 |
| 項目 | 必要性 | 説明 |
|---|---|---|
| SSO_CLIENT_ID SSO_CLIENT_SECRET | 必須 | SSO から取得します。シークレットは環境変数かシークレット管理にだけ置き、コード・HTML・Git には入れません。 |
| APP_URL | 必須 | サイトの公開アドレス (スキーム + ホスト + ポート)。Redirect URI の組み立てに使います。ユーザーはこのアドレスでサイトを開く必要があります。 |
| FLASK_SECRET_KEY / SESSION_SECRET | 必須 | セッション cookie に署名する鍵。32 バイト以上で固定にします。再起動のたびに変わると全員がサインアウトされ、error=state になります。 |
| HTTPS | 必須 | 本番は https 必須 (セッション cookie を Secure にするため)。http はローカルの http://localhost のみ。 |
| セッションの保存先 | 推奨 | Node / Go のテンプレートはセッションをメモリに置くため、再起動で消え、複数サーバーで共有されません。本番では Redis かデータベースを使ってください。 |
| Cookie の設定 | 推奨 | HttpOnly、Secure (https)、SameSite=Lax。SameSite=Strict は使わないでください (SSO から戻るときに cookie が送られません)。 |
| 外部への接続 | 必須 | バックエンドから https で https://ae-sso.advantech.com に接続できる必要があります (/token、/userinfo の呼び出し)。 |
| Content-Security-Policy | 任意 | CSP を設定している場合: script-src / style-src に https://ae-sso.advantech.com を追加 (または自分でファイルを置く)、写真用に img-src にも追加。 |
| 時刻同期 (NTP) | 任意 | ユーザー・グループ API を使う場合、デバイスが署名する JWT の有効期間は短いため、サーバーの時刻誤差は 1 分以内にしてください。 |
# .env (never commit this file) SSO_CLIENT_ID=svc_xxxxxxxx SSO_CLIENT_SECRET=xxxxxxxx APP_URL=https://myapp.advantech.world SESSION_SECRET=<64 random characters: openssl rand -hex 32>
以下のファイルは URL で直接参照するか、ダウンロードして自分のサイトに置けます。URL は固定で、名前は変わりません。
| ファイル | URL | 説明 | |
|---|---|---|---|
| advantech-sso.js | https://ae-sso.advantech.com/assets/js/advantech-sso.js | ダウンロード | サインインボタン、ユーザーバッジ、項目表示、未サインイン時の自動リダイレクト、多言語。依存なし、約 10 KB。 |
| advantech-sso.css | https://ae-sso.advantech.com/assets/css/advantech-sso.css | ダウンロード | サインインページ、ボタン、バッジのスタイル。クラスはすべて adv-sso- で始まり、既存のスタイルに影響しません。 |
| logo.svg | https://ae-sso.advantech.com/static/logo.svg | ダウンロード | Advantech ロゴ (青地に白)。 |
| login.html | https://ae-sso.advantech.com/developers/files/login.html | ダウンロード | サインインページの完全なテンプレート。 |
| index.html | https://ae-sso.advantech.com/developers/files/index.html | ダウンロード | 保護されたページのテンプレート (名前、部署、写真)。 |
本番では JS / CSS をダウンロードして自分のサイトに置くと、SSO のメンテナンスの影響を受けません。直接参照すれば常に最新版です。
| 言語 | ファイル | 完全なテンプレート | |
|---|---|---|---|
| Python / Flask | flask_app.py | ダウンロード | .zip |
| Node.js / Express | express_app.mjs | ダウンロード | .zip |
| PHP | sso.php | ダウンロード | .zip |
| C# / ASP.NET Core | Program.cs | ダウンロード | .zip |
| Java / Spring Boot | SsoController.java | ダウンロード | .zip |
| Go | main.go | ダウンロード | .zip |
バックエンドに SSO 専用パッケージは不要です。各言語の標準的な HTTP とセッション機能だけを使います (Flask、Express、PHP curl、ASP.NET Core、Spring Boot、Go 標準ライブラリ)。
| API | 呼び出し元 | 認証方法 | 説明 |
|---|---|---|---|
| GET /authorize | ブラウザー | — | パラメータ:client_id、redirect_uri(登録済みのものと完全一致)、response_type=code、state(ランダム値を使い、戻ったときに照合) prompt → |
| POST /token | バックエンド | Client ID + Secret | フォームパラメータ:grant_type=authorization_code、code、redirect_uri、client_id、client_secret(HTTP Basic も可)。code は一度きりで 60 秒間有効です。 |
| GET /userinfo | バックエンド | Bearer access_token | Authorization: Bearer <access_token> を付けるとユーザー情報を返します。アクセストークンの有効期間は 1 時間です。 |
| GET /userinfo/photo | バックエンド | Bearer access_token | ユーザーの写真 (サービスに「写真」項目の許可も必要)。 |
| GET /photo/{token} | ブラウザー | 署名付き URL (7 日間) | <img src> にそのまま使える写真の URL (写真がなければ含まれない) |
| GET /logout | ブラウザー | — | SSO からサインアウトします。?redirect_uri= を付けると登録済みサイトの URL に戻れます。 |
| GET /api/directory/… | 登録済みデバイス | デバイスの秘密鍵で署名した JWT | Azure オブジェクト ID、UPN またはメールでユーザー 1 件 (/userinfo と同じ形式、サービスが見られる上司・部下・グループなどを含む)。 → |
/authorize に prompt を付けると、今回のサインインで画面を表示するか、パスワードを再入力させるかを決められます。テンプレートの /auth/login?silent=1 は prompt=none です。
| prompt | ユーザーに見えるもの | 使う場面 |
|---|---|---|
| (指定なし) | いずれかのサービスでサインイン済みなら画面なしで通過。そうでなければ Microsoft のサインイン画面 (Microsoft が覚えていればそのまま通過することも)。 | 通常の「サインイン」ボタン。 |
| none | 画面は一切表示しません。SSO にサインイン済みなら code 付きで戻り、未サインインなら error=login_required、権限がなければ error=access_denied。 | サイトを開いたときに自動でシングルサインオンを試み、失敗したときだけ自分のサインインページを表示。 |
| select_account | Microsoft の「アカウントを選択」画面。既存のアカウント (通常パスワード不要) か「別のアカウントを使用」を選べます。 | 「アカウント切り替え」ボタン、複数人で共用する PC。 |
| login | 必ずアカウントとパスワードを再入力 (会社の MFA も)。SSO や Microsoft にサインイン済みでも同じです。 | 重要な操作の前の本人再確認 (承認、権限変更、給与情報など) や機密性の高いシステム。 |
consent など) は無視され、指定なしと同じです。select_account を使い、同じアカウントに勝手に戻らないようにします。login_required / access_denied がエラーとしてコールバックに戻るのは prompt=none のときだけです。それ以外は SSO または Microsoft の画面でユーザーが対応します。# 画面なしで、自動サインインできるかだけ試す
https://ae-sso.advantech.com/authorize?client_id=svc_xxxxxxxx&redirect_uri=…&response_type=code&state=RANDOM&prompt=none
# パスワードを必ず再入力させる
https://ae-sso.advantech.com/authorize?client_id=svc_xxxxxxxx&redirect_uri=…&response_type=code&state=RANDOM&prompt=login
# テンプレートの /auth/login に prompt を追加
q["prompt"] = "login" # Python (/auth/login)
q.set("prompt", "login"); // Node.js
$q['prompt'] = 'login'; // PHP
| パラメーター | 説明 |
|---|---|
| redirect_uri | サインアウト後に戻るアドレス。登録済みサービスのアドレス (同じドメイン) である必要があります。 |
| microsoft=1 | 今回は Microsoft アカウントからもサインアウトし、次回は必ずパスワードを求めます (同じブラウザーの Outlook、Teams Web 版もサインアウト)。 |
| microsoft=0 | 管理者が「Microsoft からもサインアウト」をオンにしていても、今回はサイトと SSO だけサインアウト。 |
| (指定なし) | 管理者の「Azure AD 設定 → サインアウトの動作」に従います (既定は SSO のみ)。 |
SSO とフロントエンドキットが大部分を処理します。残りは必ずバックエンドで実装します。Client Secret の保管と「誰が何をできるか」の判断は、自分のサーバーにしかできないからです。
| 機能 | 担当 | 説明 |
|---|---|---|
| パスワード、MFA | SSO が提供 | Microsoft が処理します。サイトがパスワードを見ることはありません。 |
| サービス間シングルサインオン | SSO が提供 | どれかのサービスでサインインすれば、他は自動で通過します (テンプレートの /auth/login?silent=1)。 |
| ユーザー情報、写真、上司 / 部下 | SSO が提供 | サインイン時に一緒に返します。項目はサービスのデータ権限に従います。 |
| サインインボタン、ページ、ユーザーバッジ | フロントエンドキットが提供 | advantech-sso.js / .css と login.html。 |
| /auth/login | 自分で実装 (テンプレートあり) | ランダムな state を作って SSO にリダイレクト。 |
| /auth/callback | 自分で実装 (テンプレートあり) | state を確認し、code と Client Secret で /token を呼び、セッションを作成。必ずバックエンドで (Client Secret が必要なため)。 |
| /auth/me | 自分で実装 (テンプレートあり) | 現在のユーザー JSON をフロントエンドキットに返す。未サインインなら 401。 |
| /auth/logout | 自分で実装 (テンプレートあり) | 自分のセッションを消し、SSO の /logout にリダイレクト。 |
| セッション管理 | 自分で実装 (テンプレートあり) | 有効期間、保存先、サインイン後のセッション ID 更新。 |
| ページと API の保護 | 自分で実装 (テンプレートあり) | サインインが必要なページと API はすべてバックエンドでセッションを確認します。フロントエンドでボタンを隠すのは保護になりません。 |
| 権限 (誰が何をできるか) | 必ず自分で開発 | SSO が伝えるのは「誰か」と部署・グループなどの属性です。「AE 部門だけ編集可」といったルールは自分のシステムで判断します。 |
| 自システムのユーザー情報 | 必ず自分で開発 | ユーザーを保存する場合 (設定、注文など) は sub をキーにします。メールは改名で変わります。 |
| ユーザー情報の更新 | 任意 | サインイン時の情報はセッションに残ります。最新の情報が必要なら access_token の有効期間 (1 時間) 内に /userinfo を呼ぶか、もう一度サインインしてもらいます (自動で通過)。 |
| 全サービス一括サインアウト | 任意 | 現在は未対応です。SSO のサインアウトは SSO の状態だけを終了し、各サイトのセッションはそれぞれの期限で切れます。 |
| サーバーからのユーザー照会 (ユーザー・グループ API) | 任意 | 必要な場合はデバイスで鍵を作り、署名した JWT で /api/directory/* を呼びます (基本版の「ユーザー・グループ API」参照)。 |
Advantech Single Sign-On