feat: ncue /go ref로 author_id 설정

- ref_type/ref(이메일 또는 IP) 수신 시 쿠키로 유지
- 링크 저장 시 ref 기반으로 author_id(text) 채움

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dsyoon
2026-02-08 11:58:24 +09:00
parent 7d0c3393d1
commit 0b7a814791
2 changed files with 33 additions and 2 deletions

View File

@@ -91,3 +91,12 @@ python app.py
- 초기 화면은 DB에서 **첫 페이지(기본 30개)** 만 가져와 SSR로 즉시 렌더링합니다.
- 메타데이터 추출은 캐시를 사용합니다(성공/실패 TTL 각각 적용).
## ncue.net 연동 (ref 전달)
`ncue.net``/go`에서 아래와 같이 전달되는 값을 받아 `author_id(text)`에 저장합니다.
- 로그인 사용자: `ref_type=email&ref=<email>`
- 비로그인 사용자: `ref_type=ip&ref=<ip>`
이 값은 최초 진입 시 쿼리스트링으로 들어오며, 이후 요청에서도 유지되도록 서버가 쿠키로 저장합니다.

26
app.py
View File

@@ -9,7 +9,7 @@ import psycopg2
import requests
from bs4 import BeautifulSoup
from dotenv import load_dotenv
from flask import Flask, jsonify, render_template, request
from flask import Flask, jsonify, make_response, render_template, request
load_dotenv()
@@ -210,6 +210,14 @@ def get_request_identity(req) -> tuple[str | None, str | None]:
- 이메일: 프록시/SSO가 주입하는 헤더에서 추출
- IP: X-Forwarded-For / X-Real-IP / remote_addr 순
"""
# 0) ncue.net/go 연동: ref_type/ref 를 쿼리스트링 또는 쿠키로 전달받을 수 있음
ref_type = (req.args.get("ref_type") or req.cookies.get("ref_type") or "").strip()
ref = (req.args.get("ref") or req.cookies.get("ref") or "").strip()
if ref_type in ("email", "ip") and ref:
if ref_type == "email":
return ref, None
return None, ref
email_headers = [
"X-User-Email",
"X-Forwarded-Email",
@@ -234,6 +242,17 @@ def get_request_identity(req) -> tuple[str | None, str | None]:
return email, ip
def _maybe_set_ref_cookies(resp):
ref_type = (request.args.get("ref_type") or "").strip()
ref = (request.args.get("ref") or "").strip()
if ref_type in ("email", "ip") and ref:
# JS 요청(/links)에서도 유지되도록 쿠키 저장 (SameSite=Lax)
max_age = 60 * 60 * 24 * 30 # 30일
resp.set_cookie("ref_type", ref_type, max_age=max_age, samesite="Lax")
resp.set_cookie("ref", ref, max_age=max_age, samesite="Lax")
return resp
def fetch_links_page_from_db(limit: int, offset: int):
table = os.getenv("TABLE", "news_link")
schema = os.getenv("DB_SCHEMA", DEFAULT_SCHEMA)
@@ -268,13 +287,16 @@ def index():
)
except Exception as exc:
error_message = f"DB 조회 실패: {exc}"
return render_template(
resp = make_response(
render_template(
"index.html",
links=links,
error_message=error_message,
placeholder_data_uri=PLACEHOLDER_DATA_URI,
default_image=DEFAULT_IMAGE,
)
)
return _maybe_set_ref_cookies(resp)
@app.get("/links")