Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ptt 帳號機制 - email. #79

Open
chhsiao1981 opened this issue Jan 7, 2021 · 5 comments
Open

ptt 帳號機制 - email. #79

chhsiao1981 opened this issue Jan 7, 2021 · 5 comments

Comments

@chhsiao1981
Copy link
Collaborator

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

(以下是跟某真強者朋友討論以後的紀錄~)

  1. 既有 ptt 不能更換信箱~
    如果真有被盜帳號情形~
    是會造成困擾.

  2. 除了"聯絡 email"以外. 希望還有"藍勾勾 email"的存在. 用來作為確認使用者真實存在的方式.

  3. 希望可以盡量減少改動 c-pttbbs 的部分.

Describe the solution you'd like
A clear and concise description of what you want to happen.

  1. 如果有設定藍勾勾 email. 站方會在以下情形使用到藍勾勾 email:
  • 被盜帳號時的回復.
  • 站方不定期重新確認使用者還是同一人.
  1. 站方會在以下情形使用到"聯絡 email":
  • 沒有設定藍勾勾 email 時的被盜帳號的回復.
  • 忘記密碼.
  • forward default email.
  • 站方需要特別公告時使用的 email.

根據 #76 的討論.
藍勾勾 email 可以是校級 email / (校友 email) / 政府機關級 email.
站方可以不定期要求重新認證以確認使用者還是同一人.
如果有發現校級 email / 校友 email / 政府機關級 email 有大量產生的事情.
站方可以公告後 ban 掉整個單位.
單位可以有申訴管道 / 提出如何改進他們的 email 管理系統來解除 ban.

Implementation

  1. 不論是聯絡 email 或是藍勾勾 email. 設定/更改 email 都分成兩個 stages.
  • attempt stage: 由 go-pttbbs 統一產生 n mins (n = 15 for now) expired token. middleware 根據 token 和 user-id 組成認證 url. 寄出認證信.
  • verify-change stage: middleware 丟給 go-pttbbs 統一 verify token. 然後 verify 成功以後. middleware 會存一份 verify 相關資訊.
  1. 之後會跟 c-pttbbs 討論如何存回 .PASSWD. 並且 c-pttbbs 如何應用藍勾勾 email.

Additional context
Add any other context or screenshots about the feature request here.

@chhsiao1981
Copy link
Collaborator Author

chhsiao1981 commented Jan 9, 2021

Implementation:

  1. go-pttbbs 本身不紀錄藍勾勾 email / 藍勾勾 information. go-pttbbs 只會紀錄藍勾勾 user-level.
  2. 原本希望可以直接存 userec_t 的 userlevel. 但是 userlevel 已經滿了. 需要有 userlevel2 的欄位.
  3. 在不動 userec_t 的前提下. 會有 .PASSWD2.
  4. 考慮到 user-delete 時需要同步. 跟 .PASSWD 不同的是 .PASSWD2 將會存在 user-home 裡. 每個 user 有各自的 .PASSWD2.
  5. 既有的 c-pttbbs 可以 optionally 拿到 .PASSWD2 來使用 userlevel2.
  6. 目前 userlevel2 主要存放藍勾勾 user-level. 目前是 ID_EMAIL. 以後可以有 ID_TWID, ID_PHONE, ...
  7. 如果 c-pttbbs 覺得 ok 的話. 可以在之後將 userlevel2 整合回去 userec_t 的 pad-tail.
  8. 設定 user-level2 時. middleware 仍須提供 token 讓 go-pttbbs 做 verify.

@chhsiao1981
Copy link
Collaborator Author

#76

implementation 的 demo 可以在 https://www.devptt.site 裡看到~

分成聯絡 email 和 認證 email:
聯絡 email:

  • 會檢查 unique email.
  • 會 update pttbbs 裡的 email 欄位.
  • n 天內 (n = 1) 最多只能換一次.

認證 email (idemail):

  • 會檢查 unique idemail.
  • 會多 ${BBSHOME}/${USERHOME}/.PASSWD2. UserLevel2 暫時放在這裡.
  • n 天內 (n = 100) 最多只能換一次.

聯絡 email:

  • attempt-change-email (進到更改聯絡信箱頁. 按下 submit 時所 call 的 function):
    • go-openmiddleware:
      1. 確認 unique email.
      2. 確認 client 是 ok 的. (不確定有沒有效.)
      3. 將 passwd / email / client-info 丟給 go-pttbbs. 讓 go-pttbbs 檢查 password 並且產生 token.
      4. 將 email / token 組成 url. 寄信給 user 確認.
    • go-pttbbs:
      1. 檢查是否是 ok 的 user.
      2. 檢查 password.
      3. 產生 token 並 return.
  • change-email (user 在 email 按 link 以後. 先回到 html. html 在 load 時直接 call change-email):
    • go-openmiddleware
      1. 跟 go-pttbbs 詢問 email-token 的 info (go-pttbbs 會在這層擋掉不 ok 的 user).
      2. 根據 email-token 的 info. 先在 db 嘗試 create 一個 not-set 的 data (擋掉 unique)
      3. 跟 go-pttbbs update email.
      4. 在 db 裡 update is-set.
    • go-pttbbs
      1. 確認 user 和 token 是相符的.
      2. 更改 pttbbs email.
      3. return.

認證 email:

  • attempt-set-id-email (進到更改認證信箱頁. 按下 submit 時所 call 的 function):
    • go-openmiddleware:
      1. 確認 unique email.
      2. 確認 client 是 ok 的. (不確定有沒有效.)
      3. 將 passwd / email / client-info 丟給 go-pttbbs. 讓 go-pttbbs 檢查 password 並且產生 token.
      4. 將 email / token 組成 url. 寄信給 user 確認.
    • go-pttbbs:
      1. 檢查是否是 ok 的 user.
      2. 檢查 password.
      3. 檢查是否是 ok 的認證 email.
      4. 產生 token 並 return.
  • set-id-email (user 在 email 按 link 以後. 先回到 html. html 在 load 時直接 call set-id-email):
    • go-openmiddleware
      1. 跟 go-pttbbs 詢問 email-token 的 info (go-pttbbs 會在這層擋掉不 ok 的 user).
      2. 根據 email-token 的 info. 先在 db 嘗試 create 一個 not-set 的 data (擋掉 unique)
      3. 跟 go-pttbbs update email.
      4. 在 db 裡 update is-set.
    • go-pttbbs
      1. 確認 user 和 token 是相符的.
      2. 在 ${BBSHOME}/${USERHOME}/.PASSWD2 設定 user-level2
      3. return.

@chhsiao1981
Copy link
Collaborator Author

TODO:

在 attempt-change-password / attempt-change-email / attempt-set-id-email 加上 2FA.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant