로그인 방법
앱 사용자가 로그인하는 방법을 고릅니다. 이메일과 비밀번호, 이메일 링크, Runlot, 직접 만든 GitHub·Google 앱, OpenID Connect 제공자 중에서 고를 수 있습니다.
로그인 방법은 모두 하나의 목록에 있습니다. 대시보드의 로그인 및 접근 탭에서 앱 사용자 아래에 전부 표시되고, runlot auth status 도 같은 목록을 보여 줍니다.
| 방법 | 켜기·끄기 |
|---|---|
| 이메일과 비밀번호 | runlot auth set password on|off |
| 이메일 링크 | runlot auth set magic-link on|off |
| Runlot | runlot auth provider runlot on|off |
| 직접 만든 GitHub·Google 앱 | runlot auth provider set github|google …, runlot auth provider rm … |
| OIDC 제공자 | runlot auth provider oidc add <id> …, runlot auth provider oidc rm <id> |
제공자를 바꾸려면 admin 역할이 필요합니다.
409 last_method 로 거절됩니다. 앱에 로그인이 아예 필요 없다면 로그인 기능 자체를 끄세요.이메일과 비밀번호, 이메일 링크
둘 다 기본으로 켜져 있습니다.
runlot auth set password off # 비밀번호 로그인 끄기
runlot auth set magic-link off # 이메일 링크 로그인 끄기비밀번호 로그인을 끄면 비밀번호 경로가 404 method_disabled 로 답하고 기본 로그인 화면에서 입력란이 사라집니다. 저장된 비밀번호 해시는 그대로 남으므로 다시 켜면 해당 계정으로 그대로 로그인할 수 있습니다. 둘 다 꺼도 이메일 확인 메일은 계속 발송됩니다. 소셜 로그인만 쓰는 앱도 이메일 주소는 확인해야 하기 때문입니다.
Runlot
runlot auth provider runlot on로그인 화면에 Runlot 으로 계속하기 버튼 하나가 생깁니다. 버튼을 누르면 앱 이름과 로고가 표시된 Runlot 화면으로 이동하고, 그곳에서 이메일과 비밀번호, Google, GitHub 중 하나로 로그인합니다. 로그인을 마치면 앱으로 돌아옵니다. 등록할 client ID, 시크릿, 콜백 URL 이 없고, 커스텀 도메인을 추가해도 바꿀 것이 없습니다.
사용자는 앱에 runlot 아이덴티티 제공자로 저장됩니다. subject 는 앱마다 다른 값(pairwise ID)이라서, 같은 사람이라도 앱마다 subject 가 다르고 두 앱이 이 값으로 사용자를 맞춰 볼 수 없습니다. 이메일은 Runlot 이 확인한 경우에만 전달됩니다.
설치 환경에서 Runlot 로그인을 제공하지 않으면 명령이 409 runlot_unavailable 로 답합니다.
runlot auth provider runlot off직접 만든 GitHub·Google 앱
제공자의 동의 화면에 앱 이름을 보이고 싶거나, 할당량을 따로 쓰거나, GitHub Enterprise Server 를 써야 한다면 직접 만든 OAuth 앱을 등록하세요.
runlot auth provider set github --client-id <id> --client-secret <secret>
runlot auth provider set google --client-id <id> --client-secret <secret>--client-secret 을 생략하면 터미널에서 값을 입력하라는 안내가 표시됩니다.
자체 호스팅 환경에서 GitHub 가 GitHub Enterprise Server 라면 github 줄에 --issuer https://github.acme.example 을 붙이세요. 이 옵션은 github 에만 적용되며, 대시보드에도 같은 입력란이 있습니다.
OpenID Connect 제공자
OpenID Connect 를 지원하는 제공자라면 원하는 ID 로 추가할 수 있습니다. LINE, Apple, Microsoft Entra, Okta, Keycloak, 회사 IdP 모두 가능합니다.
runlot auth provider oidc add <id> --issuer https://idp.example.com \
--client-id <client-id> [--name "Example"] [--icon https://…/icon.svg] [--scopes "openid email profile"]
# 클라이언트 시크릿은 프롬프트로 입력합니다
runlot auth provider oidc rm <id><id>는 직접 정하는 짧은 이름입니다. 영문 소문자로 시작하고 소문자·숫자·하이픈으로 2~31자입니다.github,google,runlot은 쓸 수 없습니다.--issuer는https여야 합니다. 저장할 때<issuer>/.well-known/openid-configuration을 읽으며, 실패하면400 oidc_discovery_failed와 함께 제공자의 응답을 보여 주고 저장하지 않습니다.--scopes를 생략하면openid email profile을 사용합니다.
로그인할 때마다 ID 토큰의 서명, issuer, audience, 만료 시각, nonce 를 검증합니다. 이메일 확인 여부(email_verified)를 알려 주지 않는 제공자로 가입한 사용자는 미확인 상태로 만들어지며, 이메일이 같아도 기존 계정과 연결되지 않습니다.
대시보드의 OIDC 제공자 추가 에도 같은 입력란이 있고, 저장하기 전에 콜백 URL 을 보여 줍니다.
예: 카카오
카카오 로그인은 OpenID Connect 를 켜면 OIDC 로 연결할 수 있습니다.
- Kakao Developers 콘솔에서 앱을 열고 카카오 로그인 메뉴에서 OpenID Connect 를 켭니다.
- Redirect URI 에 콜백 URL
https://<your-domain>/__runlot/auth/callback/kakao를 등록합니다. - 제공자를 추가합니다. client ID 는 앱의 REST API 키이고, 시크릿은 보안 설정의 Client Secret 입니다.
runlot auth provider oidc add kakao --issuer https://kauth.kakao.com \
--client-id <REST API 키> --name "카카오"콜백 URL
직접 만든 GitHub·Google 앱과 OIDC 앱은 제공자 콘솔에 다음 URL 을 등록해야 합니다. 프로젝트가 응답하는 호스트마다 한 번씩 등록하세요. Runlot 은 등록할 것이 없습니다.
https://<your-domain>/__runlot/auth/callback/<id>정확한 목록은 runlot auth status 가 보여 줍니다. 커스텀 도메인을 추가하면 그 콜백 URL 도 제공자 콘솔에 추가하세요. 빠뜨린 호스트에서는 로그인이 실패하고, 오류는 제공자 쪽에만 표시됩니다.
가입·이메일 설정도 적용됩니다
allowSignup 과 requireVerifiedEmail 은 모든 로그인 방법에 똑같이 적용됩니다. 가입을 끄면 어떤 제공자로도 새 사용자를 만들 수 없고, 이메일 확인을 필수로 하면 이메일을 확인해 주지 않는 제공자로는 세션을 받을 수 없습니다.
직접 만든 로그인 화면에서 쓰기
켜 둔 방법은 기본 로그인 화면에 버튼으로 나타납니다. 직접 만든 로그인 화면에서는 버튼을 하드코딩하지 말고 켜져 있는 방법을 조회하세요.
import { providers, signInUrl } from "@runlot/auth/client";
for (const p of await providers()) {
// p.id 는 "runlot", "github", "google" 또는 직접 정한 OIDC ID 이며, OIDC 항목에는 name 과 icon 이 있습니다
render(<a href={signInUrl(p.id, { next: "/app" })}>Continue with {p.name ?? p.id}</a>);
}signInUrl("github", { next: "/app" }) 은 /__runlot/auth/sign-in/github?next=%2Fapp 로 연결됩니다. next 가 외부 URL 이거나 // 로 시작하면 보안을 위해 무시합니다.
같은 이메일의 계정 연결
비밀번호 로그인과 제공자가 같은 확인된 이메일 주소를 쓰면 하나의 사용자 계정으로 연결됩니다. 사용자가 어떤 제공자를 쓰는지는 user.providers 로 확인할 수 있습니다.
const user = await env.auth.user(request);
user.providers; // ["password", "github"]제공자 삭제
runlot auth provider rm github삭제한 제공자로만 로그인하던 사용자는 비밀번호 로그인이 켜져 있다면 비밀번호를 재설정해 다시 로그인할 수 있습니다.