跳轉到

登入 (Signing In)

登入卡就是 /login 路由,而到底有沒有人會到得了它,是由服務決定,而不是由瀏覽器決定。關卡開著時,服務的資料與它的即時更新都保持關閉,直到瀏覽器登入為止;關卡關著時,這個路由會把每一位訪客直接送回應用程式。登入買到的只是入場資格,別無其他——服務比對一次帳號與密碼,之後只把名稱留下來標示登出按鈕,此後它所做的任何事都不取決於用的是哪個帳戶。

關卡是否開著

這由服務組態的 Auth 區段透過其 Enabled 旗標決定。沒有任何設定時,這個旗標退回為關閉,所以組態裡沒有 Auth 區段、或有這個區段但旗標關閉的服務,完全不需要登入就能運行。出貨的組態讓旗標保持關閉,也不帶任何帳戶,所以裝在自己電腦上的 HiNC 會直接進入應用程式;要讓其他電腦連線的服務,會在自己的設定裡打開旗標,並寫上自己的帳戶。

帳戶就是同一區段裡的 Users 清單——一組組帳號與密碼的配對,在服務啟動時讀取一次。每一筆項目授予的存取權完全相同:沒有角色、沒有群組成員資格,也完全沒有任何東西是按帳戶保存的。應用程式內部也沒有任何方法可以建立帳戶、更改密碼或找回密碼。這三件事都是對服務組態的編輯,由運行服務的人來做,並在服務下次重新啟動時生效。在 Windows 上已安裝的副本裡,這份組態就是資料目錄裡的 appsettings.local.json——它在哪裡、怎麼在那裡用自己的帳戶打開登入,見在 Windows 上安裝 HiNC。

關卡關住的是服務自己的介面:各畫面為取得資料所發出的請求,以及讓那些畫面保持最新的即時通道。它關住的不是頁面。應用程式外殼、品牌標誌與登入卡本身,都到得了一個未持有工作階段的瀏覽器:品牌標誌與繪出登入卡所用的建置套件 (bundle) 都是一般檔案,在查詢授權之前就已送出,而外殼頁面則是完全豁免於關卡之外。

登入

登入卡在請登入以繼續的提示之下,要求輸入一組憑證。

  1. 把帳號名稱鍵入帳號欄、密碼鍵入密碼欄。登入卡出現時,焦點已經在帳號欄上;密碼欄右側的眼睛圖示可切換是否顯示鍵入的內容。
  2. 按登入按鈕送出,或在任一欄位按 Enter 送出。
  3. 兩個欄位都不在瀏覽器端檢查,所以不論輸入什麼——包括一組空白——都會送到服務,而拒絕也是來自服務,而不是來自表單。拒絕以密碼欄下方的一行紅字出現:帳號或密碼錯誤,登入卡則維持原樣。

登入成功會在原本想去的畫面重新載入應用程式。若瀏覽器是在試圖前往某個特定畫面時被送到登入卡的,那個網址會跟著它、放在登入卡的 redirect 查詢引數裡——連 ?tree= 選取也包含在內——登入後就回到那裡。自行前來登入卡的瀏覽器,則會落在「執行」頁面。

登入卡還帶著兩件小東西。名稱底下那行灰字是版本標記,與進去之後選單列顯示的是同一個版本。而登入卡自己的語言,是這個瀏覽器上次所用的語言,首次造訪時則是瀏覽器本身的語言,因為語言設定屬於服務,和服務裡的其他一切一樣都在關卡之後;登入之後,介面就跟隨那項設定——服務上所有人共用一個值——它在「偏好設定」選單的「語言」子選單裡選擇(見偏好設定)。

下圖是未持有工作階段的瀏覽器上、位於 /login 的登入卡。整個畫面只有這張卡——背後沒有畫出任何應用程式框架——名稱底下是版本標記與提示文字,焦點已在帳號欄,密碼欄右側是眼睛切換鈕。

一個素灰的頁面上只有一張白色卡片:HiNC 品牌標誌與名稱,其下是版本標記與「請登入以繼續」的提示,一個持有焦點的空白「帳號」欄、一個帶眼睛切換鈕的「密碼」欄,以及右下角的「登入」按鈕

登入頁面沒有出現時

有三種情形會造成這樣,按可能性高低排列。

關卡是關的——HiNC 出貨時就是這樣。沒有 Auth 區段、或 Enabled 關閉時,/login 路由會把每一位訪客重新導向回應用程式,而不是顯示表單。從裡面看,最快的判斷依據是選單列:沒有關卡的服務,選單列上沒有登出按鈕。

瀏覽器已經登入。它的工作階段 cookie 仍然有效,所以登入卡被略過,直接開啟所要求的畫面。

服務答不上來。應用程式在第一次導覽時會問服務一次:關卡是否存在、這個瀏覽器是否已通過。如果這個問題沒有得到回答,應用程式就假設沒有關卡並放瀏覽器通過——它是「失效即開放」(fails open) 的。在關卡實際上是開著的服務上,結果就是一個開在所要求畫面上、卻什麼都載不進來的視窗:沒有專案、面板始終填不進東西,背後則是服務正在拒絕的請求。選單列是破綻——品牌標誌旁邊沒有版本標記、右端沒有登出按鈕,因為兩者都要靠那個從未到達的回答來填入。在這個狀態下,沒有任何東西會提供登入卡,也沒有任何東西會重新導向到登入卡。重新載入頁面會再問一次;在得到回答之前,每次導覽都會重新問,而一旦服務回答了,瀏覽器就會以正常方式抵達登入卡。

登出

登出按鈕是選單列右端的最後一樣東西。它以已登入的使用者名稱作為標籤——服務未回報名稱時則標示為登出——它的工具提示也讀作登出。只有在關卡開著且這個瀏覽器已登入時才會畫出它。

按下它即結束這個瀏覽器的工作階段。頁面會被拆掉,並在登入卡重建。如果送往服務的請求沒有送達,服務仍把這個瀏覽器視為已登入,所以登入卡會把它直接送回應用程式——再按一次按鈕即可。

結束的是一個瀏覽器的入場資格。以同一帳戶登入的另一個瀏覽器不受影響,會繼續運作:服務不保存誰正在連線的名冊,所以不會有帳戶正在別處使用的通知,也不限制多少個瀏覽器可以同時持有它。

當工作階段自行結束時

登入隸屬於瀏覽器工作階段,所以不論組態怎麼說,關閉瀏覽器就結束了它。瀏覽器保持開啟時,它最多持續 Auth 區段的 SessionHours 設定所指定的小時數——出貨組態是八小時,而不論設定寫什麼,都不會少於一小時。滑動到期 (sliding expiration) 預設為開啟,服務對這項設定的描述是:隨活動刷新到期時間。

沒有任何東西會預告結束將至。沒有倒數、沒有提示,也沒有延長的辦法。第一個徵兆就是登入卡,它會在某個畫面下一次向服務要求東西而被拒絕的那一刻出現。

復原就是再登入一次。原本開著的畫面會放在 redirect 引數裡帶過去,所以登入後會直接回到那裡;回不來的是在那個畫面上輸入或安排好、卻尚未儲存的東西,因為登入會從頭重新載入應用程式。工作階段只是瀏覽器的入場資格,別無其他——結束它改變的是那個瀏覽器可以要求什麼,而不是服務手上持有的東西。

每當瀏覽器登入同一台電腦上的另一個 HiNC——另一站,用同一個名稱、不同埠連到的——工作階段就結束,這表示兩個服務共用同一個 cookie 名稱:瀏覽器每個電腦名稱只有一組 cookie,不分埠。同樣的共用,也可能讓瀏覽器不經第二個服務的登入卡就進去。請給每個服務一個自己的 cookie 名稱 Auth:CookieName;它設在哪裡,見在 Windows 上安裝 HiNC。

被鎖在外面

關卡開著、帳戶清單卻是空的,誰都進不去,而它看起來和打錯密碼一模一樣——同樣的一行紅字,試過的每個名稱、在每個瀏覽器上都是如此。沒有任何東西在計算嘗試次數,也沒有任何東西會在輸錯一次後鎖定,所以任何人想得到的每個帳戶都反覆被拒,這個症狀該讀成組態問題,而不是憑證問題。登入卡什麼都不計算,但服務日誌會把每一次拒絕記成一則警告,連同試過的名稱與它來自的位址——要從服務所在磁碟上的檔案去讀,因為日誌檢視器也在同一道登入之後。

解法就是一筆項目。在服務組態 Auth 區段的 Users 清單裡加入一組帳號與密碼的配對,然後重新啟動服務——那份清單只在啟動時讀取一次。

這個狀態既不是永久的,也不會造成損害。服務在把瀏覽器擋在外面的整段期間都正常運行;它只是沒有可以拿來比對的憑證。

延伸閱讀

  • 基礎 — 每個畫面都成立的其他事項
  • 應用程式視窗 — 末端放著登出按鈕的那條選單列
  • 畫面導覽 — 登入後會回到的各個畫面,以及為它們命名的網址
  • 偏好設定 — 服務替其上所有人保存的設定,語言就是其中之一