Skip to content

Troubleshooting

필수 환경변수

변수값 예시빠지면
LOGI_API_URLhttps://api.1pass.devlocalhost:3000 fallback → 연결 실패
LOGI_CLIENT_IDlogi_xxxxxxxxxxxxxxxxclient_id missing 400
LOGI_CLIENT_SECRETlogi_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=sandboxlocalhost/*.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)

원인:

  1. LOGI_CLIENT_SECRET prod env 미주입
  2. secret 회전 후 RP env 업데이트 누락
  3. redirect_uri mismatch — authorize/token 시점 정확히 일치 (스키마/포트/trailing slash 포함)
bash
logi apps rotate-secret $CLIENT_ID  # 출력 secret 즉시 RP env 에 복사

4. Mac/iOS 데스크톱에서 native 앱 안 열림 (브라우저로만)

원인:

  1. server-side 302 redirect — Universal Link 는 user-gesture 가 redirect chain 끊김. iOS/macOS 모두.
  2. macOS Safari browser-first — UL 클릭 시 페이지 로드 후 상단 "Open in [앱]" 배너만 노출 (WWDC19 #717 / TN3155). 한 번 더 눌러야 앱 실행 = 정상.
  3. same-domain UL suppressionapi.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
    )
  }
end
svelte
<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.


원인: 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

해결:

  1. ios/Sources/logi.entitlements + ios/project.yml:
    diff
    - applinks:api.1pass.dev?mode=developer
    + applinks:api.1pass.dev
  2. mac 동일 (mac/Sources/LogiMac.entitlements + mac/project.yml)
  3. 빌드번호 +1 → 새 TestFlight 업로드:
    bash
    cd ios && make testflight
    cd mac && make testflight
  4. 검증: 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) 우회.

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 --prod

Fly.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 금지.

MIT License · Identity가 제품의 신뢰를 만듭니다.