Part 1
Integration Setup
How to connect your institution's system with aiedu.nextain.io. Covers key issuance, SSO integration, and domain registration.
Overview
aiedu.nextain.io๋ Nextain์ด ์ด์ํ๋ AI ํํฐ ํ๋ซํผ์ ๋๋ค. ๊ธฐ๊ด์ ์์ฒด ์ธ์ฆ ์์คํ ์ SSO๋ฅผ ์ฐ๊ฒฐํ๊ณ , ํ์๋ณ API ํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ํ๋ซํผ์ ์ฌ์ฉํฉ๋๋ค.
์ ์ฒด ํ๋ฆ
Nextain admin
โโ ๊ธฐ๊ด ํค(org_key) ๋ฐ๊ธ โ ๊ธฐ๊ด ๋ด๋น์์๊ฒ ์ ๋ฌ
โโ ๊ธฐ๊ด ์์คํ
์ด ํ์ ํค(user_key) ๋ฐ๊ธ (API ํธ์ถ)
โโ ํ์์ด user_key๋ก AI ํํฐ ์ด์ฉ๊ฐ๋ฐ์๋์ด ์ง์ ๊ตฌํํ ๋ถ๋ถ์ SSO ์ฐ๋๊ณผ ํ์ ํค ๋ฐ๊ธ ๋ ๊ฐ์ง์ ๋๋ค. ๋๋จธ์ง๋ ์ ํฌ๊ฐ ์ฒ๋ฆฌํฉ๋๋ค.
Key Structure
| ํค ์ข ๋ฅ | ๋ฐ๊ธ ์ฃผ์ฒด | ์ฉ๋ |
|---|---|---|
| org_key | Nextain (์ ํฌ) | ๊ธฐ๊ด ์๋ณ, ํ๋ฅด์๋/๋ชจ๋ธ ์ค์ ์ ์ฅ |
| user_key | ๊ธฐ๊ด ์์คํ (๊ฐ๋ฐ์๋) | ํ์ ๊ฐ์ธ ์ธ์ฆ, AI ํธ์ถ |
- โ
org_key๋ ์ ํฌ๊ฐ ๋ฐ๊ธํด์ ์ ๋ฌ๋๋ฆฝ๋๋ค. ์ฝ๋์ ์ง์ ๋ฃ์ง ์๊ณ ์๋ฒ ํ๊ฒฝ๋ณ์๋ก๋ง ๋ณด๊ดํ์ธ์. - โ
user_key๋ ํ์ ๋ก๊ทธ์ธ ์ ๊ธฐ๊ด ์์คํ ์ด ์ ํฌ API๋ฅผ ํธ์ถํด์ ์๋ ๋ฐ๊ธํฉ๋๋ค.
Auth Flow
[๊ธฐ๊ด ๋ก๊ทธ์ธ ์์คํ
(SSO)]
โ
โ ๋ก๊ทธ์ธ ์ฑ๊ณต โ ์ ์ ์ ๋ณด (์ด๋ฆ, ์ด๋ฉ์ผ ๋ฑ)
โผ
[๊ธฐ๊ด ๋ฐฑ์๋ (์ธ์ด ๋ฌด๊ด)]
โ
โ POST /v1/keys (org_key + ์ ์ ์ ๋ณด)
โ โ user_key ๋ฐ๊ธ ๋๋ ๊ธฐ์กด ํค ๋ฐํ
โผ
[๋ธ๋ผ์ฐ์ / ํด๋ผ์ด์ธํธ]
โ
โ POST /api/ai (user_key + ๋ฉ์์ง + ์ฝํ
์ธ )
โผ
[aiedu.nextain.io]
โ
โ user_key ๊ฒ์ฆ โ ์ ์ ์๋ณ โ ํ๋ฅด์๋ ๋ก๋
โ โ AI ์๋ต ๋ฐํ
โผ
[AI ํํฐ ์๋ต]SSO Integration
| ๋ฐฉ์ | ์ค๋ช |
|---|---|
| OIDC (๊ถ์ฅ) | OAuth2 ๊ธฐ๋ฐ ๋ก๊ทธ์ธ. ์ต์ ์์คํ ์์ ์ฃผ๋ก ์ฌ์ฉ. |
| SAML 2.0 | ๊ธฐ์ ยท๊ธฐ๊ด ๋ ๊ฑฐ์ ์์คํ ์์ ์ฃผ๋ก ์ฌ์ฉ. XML ๊ธฐ๋ฐ. |
OIDC ์ฐ๋
์ ํฌ๊ฐ ์ ๊ณตํ๋ client_id์ client_secret์ ํ๊ฒฝ๋ณ์์ ์ค์ ํฉ๋๋ค.
AIEDU_CLIENT_ID=...
AIEDU_CLIENT_SECRET=...
ORG_KEY=org_... # Nextain์ด ์ ๋ฌํ๋ ๊ธฐ๊ด ํคSAML ์ฐ๋
SAML Assertion์์ ์ถ์ถํ ์ด๋ฉ์ผ๊ณผ ์ด๋ฆ์ ํ์ ํค ๋ฐ๊ธ API์ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค. SAML ํ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ๊ด ๊ธฐ์ ํ๊ฒฝ์ ๋ง๊ฒ ์ ํํ์ธ์.
Issue Student Key
ํ์์ด ๋ก๊ทธ์ธํ๋ฉด ๊ธฐ๊ด ๋ฐฑ์๋์์ ์๋ API๋ฅผ ํธ์ถํด user_key๋ฅผ ๋ฐ๊ธํฉ๋๋ค. ๊ฐ์ user_id๋ก ์ฌํธ์ถํ๋ฉด ๊ธฐ์กด ํค๊ฐ ๋ฐํ๋ฉ๋๋ค (์ค๋ณต ๋ฐ๊ธ ์์).
์์ฒญ ์คํ โ ์ธ์ด ๋ฌด๊ด
Method POST
URL {GATEWAY_URL}/v1/keys
Header Authorization: Bearer {ORG_KEY}
{
"user_id": "student@example.com",
"name": "ํ๊ธธ๋",
"metadata": {
"type": "user_key",
"org_key_id": "<์ ํฌ๊ฐ ์๋ ค๋๋ฆฌ๋ ๊ฐ>"
}
}Response { "key": "user_..." }
Python ์์:
import requests, os
ORG_KEY = os.environ["ORG_KEY"]
GATEWAY_URL = "https://naia-gateway-181404717065.asia-northeast3.run.app"
def issue_user_key(user_name: str, user_email: str) -> str:
res = requests.post(
f"{GATEWAY_URL}/v1/keys",
headers={"Authorization": f"Bearer {ORG_KEY}"},
json={
"user_id": user_email,
"name": user_name,
"metadata": {
"type": "user_key",
"org_key_id": "<์ ํฌ๊ฐ ์๋ ค๋๋ฆฌ๋ ๊ฐ>",
},
},
)
res.raise_for_status()
return res.json()["key"]Domain Registration
๊ธฐ๊ด ์ ์ฉ ์ ์ ์ฃผ์๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค. ์: learn.example.com โ ํด๋น ๊ธฐ๊ด ํ์๋ง ์ ์, ํด๋น ๊ธฐ๊ด SSO ์๋ ์ ์ฉ.
๋ฑ๋ก ์ ์ฐจ
- 1
๋๋ฉ์ธ ๋ฑ๋ก ์์ฒญ
์๋ ํ์ ์ ๋ณด๋ฅผ ์ด๋ฉ์ผ๋ก ์ ์ถํฉ๋๋ค.
- 2
์ธ์ฆ ํ ํฐ ์๋ น
์ ํฌ๊ฐ ๋๋ฉ์ธ ์์ ๊ถ ํ์ธ์ฉ TXT ๋ ์ฝ๋ ๊ฐ์ ๋ฐ๊ธํฉ๋๋ค.
- 3
DNS TXT ๋ ์ฝ๋ ์ถ๊ฐ
๊ธฐ๊ด DNS ๊ด๋ฆฌ์์๊ฒ ์์ฒญํด TXT ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- 4
์ธ์ฆ ํ์ธ ํ ํ์ฑํ
์ ํฌ๊ฐ ๋ ์ฝ๋๋ฅผ ํ์ธํ๋ฉด ๋๋ฉ์ธ ๋ฑ๋ก์ด ์๋ฃ๋ฉ๋๋ค.
DNS TXT ๋ ์ฝ๋ ์์
# ๋ ์ฝ๋ ํ์
: TXT
# ํธ์คํธ: _aiedu-challenge.learn.example.com
# ๊ฐ: aiedu-challenge=abc123xyz (์ ํฌ๊ฐ ๋ฐ๊ธํ๋ ํ ํฐ)DNS ์ ํ๋ ์ต๋ 48์๊ฐ ์์๋ ์ ์์ต๋๋ค. ์ถ๊ฐ ํ ์ ํฌ์๊ฒ ์๋ ค์ฃผ์๋ฉด ํ์ธํฉ๋๋ค.
๋ฑ๋ก ์ ํ์ ์ ๋ณด
| ํญ๋ชฉ | ์ค๋ช | ์์ |
|---|---|---|
| ๋๋ฉ์ธ | ๊ธฐ๊ด ์ ์ฉ ์ ์ ์ฃผ์ | learn.example.com |
| SSO ๋ฐฉ์ | ํด๋น ๋๋ฉ์ธ์ ์ ์ฉํ ์ธ์ฆ ๋ฐฉ์ | SAML / OIDC |
| SSO ๋ฉํ๋ฐ์ดํฐ URL | IdP ๋ฉํ๋ฐ์ดํฐ ์ฃผ์ | https://idp.example.com/metadata |
| ํ์ฉ ์ด๋ฉ์ผ ๋๋ฉ์ธ | ์ ์ ํ์ฉํ ์ด๋ฉ์ผ ํจํด | @example.com |