
    7)i	                        U d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddlm
Z
 ddlZddlmZ  ej                  d      ZdZ e       Zd	ed
<   dddZddZy)u!  
Magic Link 自動登入(階段 8 F)。

流程:
  1. Cooper 想給某個使用者「直接進工作台」連結時 → call generate_magic_link(user_id)
  2. 回 https://cooper-nas.taila49e28.ts.net/auth-from-line?t=<short JWT>
  3. 使用者手機點 → 外部瀏覽器打開
  4. 後端 /auth-from-line 驗 token → 發 access + refresh JWT → 回 HTML 把 token 寫入
     localStorage + redirect 到 / 主頁(已登入)

特性:
  - 短效:60 秒
  - 一次性:JTI 記在 in-memory set,用過就 invalid
  - 密鑰沿用 JWT_SECRET_KEY
    )annotationsN)datetime	timedeltatimezone)UUID)settingszcoba.magic_linki  zset[str]	_USED_JTIc           
        t        j                  t        j                        }t	        j
                         j                  }t        |       d|t        |j                               t        |t        t              z   j                               d}t        j                  |t        j                  t        j                         }| d| S )uY   產生 30 分鐘一次性的登入連結(進去後加到主畫面就免用 magic link)。magic)seconds)subtypejtiiatexp)	algorithmz/auth-from-line?t=)r   nowr   utc_uuiduuid4hexstrint	timestampr   MAGIC_TOKEN_TTL_SECjwtencoder   JWT_SECRET_KEYJWT_ALGORITHM)user_idbase_urlr   r   payloadtokens         ;/volume1/homes/robertsu/coba/app/app/services/magic_link.pygenerate_magic_linkr%   %   s    
,,x||
$C
++-

C7|3==?#C),?@@KKMNG JJw 7 78CYCYZEZ)%11    c                   	 t        j                  | t        j                  t        j                  g      }|j                  d      dk7  rt        d      |j                  d      }|st        d      |t        v rt        d	      t        j                  |       t        t              d
kD  r,t        t              dd D ]  }t        j                  |        |j                  d      }|st        d      t        |      S # t         j
                  $ r t        d      t         j                  $ r t        d      w xY w)u5   驗 token + 標記用過。失敗 raise ValueError。)
algorithmsu    連結已過期(60 秒一次性)u   連結無效r   r   u   不是 magic 類型的連結r   u   缺 jtiu   這個連結已經用過了i  Ni	  r   u   token 沒帶 user_id)r   decoder   r   r   ExpiredSignatureError
ValueErrorInvalidTokenErrorgetr	   addlenlistdiscardr   )r#   r"   r   juser_id_strs        r$   consume_magic_tokenr4   4   s   )**UH$;$;I_I_H`a {{6g%788
++e
C##
i677MM#
9~i$'Aa  ( ++e$K/00- $$ =;<<   )(()s   5D <D?)z$https://cooper-nas.taila49e28.ts.net)r    r   r!   r   returnr   )r#   r   r5   r   )__doc__
__future__r   loggingtimeuuidr   r   r   r   r   r   
app.configr   	getLoggerloggerr   setr	   __annotations__r%   r4    r&   r$   <module>rA      sZ     #    2 2  
  
		,	-  e	8 2r&   