테마
Troubleshooting
필수 환경변수
| 변수 | 값 예시 | 빠지면 |
|---|---|---|
LOGI_API_URL | https://api.1pass.dev | localhost:3000 fallback → 연결 실패 |
LOGI_CLIENT_ID | logi_xxxxxxxxxxxxxxxx | client_id missing 400 |
LOGI_CLIENT_SECRET | logi_secret_… | /oauth/token 401 |
LOGI_SCOPES (선택) | openid profile:basic email | 코드 기본값 |
⚠️ 4개 모두 동일 prefix 통일 (ONE_PASS_* 등 변종 가능). 하나라도 다르면 ENV.fetch 가 default fallback.
1분 자가 점검
bash
# 1. logi 서버 도달성
curl -I "$LOGI_API_URL/.well-known/openid-configuration"
# 2. client_id 등록 확인
logi apps verify $LOGI_CLIENT_ID --redirect-uri "$YOUR_CALLBACK_URL"
# 3. authorize URL 직접 열기
echo "$LOGI_API_URL/oauth/authorize?response_type=code&client_id=$LOGI_CLIENT_ID&redirect_uri=$YOUR_CALLBACK_URL&scope=openid&state=test&code_challenge=test&code_challenge_method=plain"
# 4. 디바이스 자가 진단 (UA · in-app · AASA · deep-link)
open https://api.1pass.dev/diagnose에러 → 원인 → 해결
1. prod에서 ERR_CONNECTION_REFUSED / 빈 화면
원인: LOGI_API_URL prod env 미주입 → http://localhost:3000 fallback.
bash
# Render 확인
curl -s "https://api.render.com/v1/services/$SERVICE_ID/env-vars" \
-H "Authorization: Bearer $RENDER_API_KEY" | jq '.[] | select(.envVar.key | startswith("LOGI"))'해결: 배포 플랫폼 env 에 LOGI_API_URL=https://api.1pass.dev 추가 → redeploy.
2. Invalid redirect_uri
원인 A: prod callback URL 미등록. 원인 B: 앱 tier=sandbox → localhost/*.staging.*/*.test.* 만 허용, prod 도메인 차단. 원인 C (가장 흔함): 커스텀 도메인 누락. 플랫폼 default (*.onrender.com) 만 등록하고 실제 prod 도메인 (www.example.com) 빠뜨림. 매칭은 scheme + host + path 정확 일치 (substring/wildcard 없음).
bash
logi apps show $CLIENT_ID # tier + redirect_uris 확인
logi apps add-redirect $CLIENT_ID "https://www.example.com/auth/callback"
logi apps add-redirect $CLIENT_ID "https://example.com/auth/callback" # apex
logi apps add-redirect $CLIENT_ID "https://yourapp.onrender.com/auth/callback" # backup권장: 커스텀 도메인 + 플랫폼 URL 모두 등록 (DNS/SSL 사고 backup, 마이그레이션 cutover 용). free 5개 / pro 20개.
Sandbox 승급: 개발자 포털 → Submit for review. 자세히는 Registering Apps.
3. /oauth/token 401 (invalid_client)
원인:
LOGI_CLIENT_SECRETprod env 미주입- secret 회전 후 RP env 업데이트 누락
redirect_urimismatch — authorize/token 시점 정확히 일치 (스키마/포트/trailing slash 포함)
bash
logi apps rotate-secret $CLIENT_ID # 출력 secret 즉시 RP env 에 복사4. Mac/iOS 데스크톱에서 native 앱 안 열림 (브라우저로만)
원인:
- server-side 302 redirect — Universal Link 는 user-gesture 가 redirect chain 끊김. iOS/macOS 모두.
- macOS Safari browser-first — UL 클릭 시 페이지 로드 후 상단 "Open in [앱]" 배너만 노출 (WWDC19 #717 / TN3155). 한 번 더 눌러야 앱 실행 = 정상.
- same-domain UL suppression —
api.1pass.dev페이지에서api.1pass.dev/...UL 클릭은 무시. 우회: cross-host bouncer (LOGI_USE_OPEN_BOUNCER=true활성화 시 server 가 자동 emit). Universal Links 가이드.
해결: server 에서 authorize URL 을 미리 생성하여 <a href> 에 직접 박기.
ruby
def new
state = SecureRandom.urlsafe_base64(32)
verifier, challenge = OnePassSsoService.generate_pkce
session[:one_pass_state] = state
session[:one_pass_code_verifier] = verifier
render inertia: "Auth/Login", props: {
one_pass_authorize_url: OnePassSsoService.authorize_url(
redirect_uri: auth_1pass_callback_url,
state: state,
code_challenge: challenge
)
}
endsvelte
<a href={one_pass_authorize_url} data-turbo="false" rel="external">logi 로 로그인</a>⚠️ 주소창 paste→enter 는 UL 트리거 안 함. 반드시 <a> 클릭으로 검증.
5. native 앱 열리지만 동의 화면 "불러오기 실패"
원인: Cold start race. OAuthConsentView 가 /api/v1/oauth/authorize/preview 호출 시점이 SessionStore.bootstrap() 의 PAK 주입보다 빨라 401.
해결: sheet 표시를 session.state == .signedIn 이후로 지연 (LogiApp.swift / LogiMacApp.swift):
swift
private var oauthSheetBinding: Binding<IdentifiableRequest?> {
Binding(
get: {
guard case .signedIn = session.state else { return nil } // race 차단
return IncomingOAuthRouter.shared.pending.map(IdentifiableRequest.init)
},
set: { value in
if value == nil { IncomingOAuthRouter.shared.clear() }
}
)
}6. Localhost 에서도 안 됨
bash
curl http://localhost:3000/up
# OK → 동작 / Connection refused → 서버 미실행logi 디렉토리에서 bin/rails server 또는 cd server && bin/dev.
7. TestFlight 빌드에서 Universal Link 안 열림
원인: entitlement applinks:api.1pass.dev?mode=developer 가 Distribution profile 로 빌드/제출됨. Apple 공식 (WWDC19 #717): "Apps signed for distribution on the App Store or TestFlight … cannot be used with this alternate mode." → ?mode=developer silently ignored → AASA association 미등록 → swcd 도메인 모름 → 브라우저 fallback.
bash
# macOS 디바이스에서 앱 설치 상태
sudo swcutil show | grep -A 8 "1pass.dev"
# 정상: Status: approved/approved해결:
ios/Sources/logi.entitlements+ios/project.yml:diff- applinks:api.1pass.dev?mode=developer + applinks:api.1pass.dev- mac 동일 (
mac/Sources/LogiMac.entitlements+mac/project.yml) - 빌드번호 +1 → 새 TestFlight 업로드:bash
cd ios && make testflight cd mac && make testflight - 검증: Safari 정상 모드에서 다른 도메인 사이트의
<a>클릭으로
?mode=developer 는 로컬 Xcode debug 빌드에서만. make dev-mode-on/off 토글, commit 금지.
🚫 same-domain URL paste 검증 / Chrome·Firefox·Brave·Safari 시크릿 검증 모두 무효.
8. SPA 라우터에서 "버튼 눌러도 반응 없음" (Turbo/Inertia/Next/HTMX)
증상: 클릭 시 /auth/logi/start 요청 한 번만 가고 멈춤. 콘솔 Cross-Origin blocked. 새 탭에서 직접 열면 정상.
원인: client-side router 가 form/link 가로채 fetch() 로 요청 → cross-origin 302 → CORS 차단 → silent fail. Turbo, Inertia <Link>, HTMX hx-get, Next <Link>, SvelteKit, Remix 모두 동일.
bash
curl -sI https://yourapp.com/auth/logi/start | grep -iE "^(HTTP|location)"
# HTTP/2 302 + location 정상이면 100% 클라이언트 사이드 문제우클릭→"새 탭"이 잘 되면 확정.
해결 (스택별):
erb
<!-- Rails Hotwire/Turbo -->
<%= link_to "1pass 로 로그인", logi_start_path, data: { turbo: false } %>html
<!-- Inertia.js — <Link> 금지 -->
<a href="/auth/logi/start">1pass 로 로그인</a>jsx
// Next.js — next/link 금지
<a href="/api/auth/logi/start">1pass 로 로그인</a>html
<!-- Vanilla / 기타 -->
<a href="/auth/logi/start" target="_top">1pass 로 로그인</a>원칙: OAuth start 는 native navigation (full page load) 으로만. fetch/XHR 감싸면 cross-origin 302 에서 죽음.
인앱 브라우저 (카톡/네이버/페북/인스타/스레드)
증상: 인앱 WebView 에서 Apple/Google 로그인 시 "허용되지 않은 브라우저" 또는 빈 화면.
처방: 외부 브라우저 escape 라우트 (/open, /x/:code) 우회.
- 데모:
start.1pass.dev/demo - 상세 (8가지 인앱 환경): Public Clients · 인앱 브라우저 escape
- iOS LogiAuth SDK: 자동 escape → ASWAS fallback
- Android/Flutter/RN:
setPackage/url_launcher externalApplication/Linking.openURL
RP 측 first-try app-to-app: 모바일 트랙 Step 3.
배포 플랫폼 env 설정
Render
bash
# 단일 변수만 PUT (collection PUT 금지 — 전체 교체됨)
curl -X PUT "https://api.render.com/v1/services/$SERVICE_ID/env-vars/LOGI_API_URL" \
-H "Authorization: Bearer $RENDER_API_KEY" \
-H "Content-Type: application/json" \
-d '{"value": "https://api.1pass.dev"}'
curl -X POST "https://api.render.com/v1/services/$SERVICE_ID/deploys" \
-H "Authorization: Bearer $RENDER_API_KEY" \
-d '{"clearCache": "do_not_clear"}'Vercel
bash
vercel env add LOGI_API_URL production
vercel --prodFly.io
bash
fly secrets set LOGI_API_URL=https://api.1pass.dev디버그
ruby
Rails.logger.info "[logi] authorize_url=#{url}"
Rails.logger.info "[logi] token_response=#{tokens.except('access_token', 'refresh_token').inspect}"bash
logi token inspect <access_token>로그 첨부 시 client_id + redirect_uri + HTTP status 만. access_token/secret 금지.