成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

無密碼驗證:服務器 登錄更安全

開發 后端
無密碼驗證可以讓你只輸入一個 email 而無需輸入密碼即可登入系統。這是一種比傳統的電子郵件/密碼驗證方式登入更安全的方法。

[[233116]]

無密碼驗證可以讓你只輸入一個 email 而無需輸入密碼即可登入系統。這是一種比傳統的電子郵件/密碼驗證方式登入更安全的方法。

下面我將為你展示,如何在 Go 中實現一個 HTTP API 去提供這種服務。 

流程

  • 用戶輸入他的電子郵件地址。
  • 服務器創建一個臨時的一次性使用的代碼(就像一個臨時密碼一樣)關聯到用戶,然后給用戶郵箱中發送一個“魔法鏈接”。
  • 用戶點擊魔法鏈接。
  • 服務器提取魔法鏈接中的代碼,獲取關聯的用戶,并且使用一個新的 JWT 重定向到客戶端。
  • 在每次有新請求時,客戶端使用 JWT 去驗證用戶。 

必需條件

  • 數據庫:我們為這個服務使用了一個叫 CockroachDB 的 SQL 數據庫。它非常像 postgres,但它是用 Go 寫的。
  • SMTP 服務器:我們將使用一個第三方的郵件服務器去發送郵件。開發的時我們使用 mailtrap。Mailtrap 發送所有的郵件到它的收件箱,因此,你在測試時不需要創建多個假郵件帳戶。

從 Go 的主頁 上安裝它,然后使用 go version(1.10.1 atm)命令去檢查它能否正常工作。

從 CockroachDB 的主頁 上下載它,展開它并添加到你的 PATH 變量中。使用 cockroach version(2.0 atm)命令檢查它能否正常工作。 

數據庫模式

現在,我們在 GOPATH 目錄下為這個項目創建一個目錄,然后使用 cockroach start 啟動一個新的 CockroachDB 節點:

  1. cockroach start --insecure --host 127.0.0.1

它會輸出一些內容,找到 SQL 地址行,它將顯示像 postgresql://root@127.0.0.1:26257?sslmode=disable 這樣的內容。稍后我們將使用它去連接到數據庫。

使用如下的內容去創建一個 schema.sql 文件。

  1. DROP DATABASE IF EXISTS passwordless_demo CASCADE;
  2. CREATE DATABASE IF NOT EXISTS passwordless_demo;
  3. SET DATABASE = passwordless_demo;
  4.  
  5. CREATE TABLE IF NOT EXISTS users (
  6. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  7. email STRING UNIQUE,
  8. username STRING UNIQUE
  9. );
  10.  
  11. CREATE TABLE IF NOT EXISTS verification_codes (
  12. id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  13. user_id UUID NOT NULL REFERENCES users ON DELETE CASCADE,
  14. created_at TIMESTAMPTZ NOT NULL DEFAULT now()
  15. );
  16.  
  17. INSERT INTO users (email, username) VALUES
  18. ('john@passwordless.local', 'john_doe');
  19.  

這個腳本創建了一個名為 passwordless_demo 的數據庫、兩個名為 users 和 verification_codes 的表,以及為了稍后測試而插入的一些假用戶。每個驗證代碼都與用戶關聯并保存創建時間,以用于去檢查驗證代碼是否過期。

在另外的終端中使用 cockroach sql 命令去運行這個腳本:

  1. cat schema.sql | cockroach sql --insecure 

環境配置

需要配置兩個環境變量:SMTP_USERNAME 和 SMTP_PASSWORD,你可以從你的 mailtrap 帳戶中獲得它們。將在我們的程序中用到它們。 

Go 依賴

我們需要下列的 Go 包:

  1. go get -u github.com/lib/pq
  2. go get -u github.com/matryer/way
  3. go get -u github.com/dgrijalva/jwt-go 

代碼 

初始化函數

創建 main.go 并且通過 init 函數里的環境變量中取得一些配置來啟動。

  1. var config struct {
  2. port int
  3. appURL *url.URL
  4. databaseURL string
  5. jwtKey []byte
  6. smtpAddr string
  7. smtpAuth smtp.Auth
  8. }
  9.  
  10. func init() {
  11. config.port, _ = strconv.Atoi(env("PORT", "80"))
  12. config.appURL, _ = url.Parse(env("APP_URL", "http://localhost:"+strconv.Itoa(config.port)+"/"))
  13. config.databaseURL = env("DATABASE_URL", "postgresql://root@127.0.0.1:26257/passwordless_demo?sslmode=disable")
  14. config.jwtKey = []byte(env("JWT_KEY", "super-duper-secret-key"))
  15. smtpHost := env("SMTP_HOST", "smtp.mailtrap.io")
  16. config.smtpAddr = net.JoinHostPort(smtpHost, env("SMTP_PORT", "25"))
  17. smtpUsername, ok := os.LookupEnv("SMTP_USERNAME")
  18. if !ok {
  19. log.Fatalln("could not find SMTP_USERNAME on environment variables")
  20. }
  21. smtpPassword, ok := os.LookupEnv("SMTP_PASSWORD")
  22. if !ok {
  23. log.Fatalln("could not find SMTP_PASSWORD on environment variables")
  24. }
  25. config.smtpAuth = smtp.PlainAuth("", smtpUsername, smtpPassword, smtpHost)
  26. }
  27.  
  28. func env(key, fallbackValue string) string {
  29. v, ok := os.LookupEnv(key)
  30. if !ok {
  31. return fallbackValue
  32. }
  33. return v
  34. }
  35.  
  • appURL 將去構建我們的 “魔法鏈接”。
  • port 將要啟動的 HTTP 服務器。
  • databaseURL 是 CockroachDB 地址,我添加 /passwordless_demo 前面的數據庫地址去表示數據庫名字。
  • jwtKey 用于簽名 JWT。
  • smtpAddr 是 SMTP_HOST + SMTP_PORT 的聯合;我們將使用它去發送郵件。
  • smtpUsername 和 smtpPassword 是兩個必需的變量。
  • smtpAuth 也是用于發送郵件。

env 函數允許我們去獲得環境變量,不存在時返回一個回退值。 

主函數

  1. var db *sql.DB
  2.  
  3. func main() {
  4. var err error
  5. if db, err = sql.Open("postgres", config.databaseURL); err != nil {
  6. log.Fatalf("could not open database connection: %v\n", err)
  7. }
  8. defer db.Close()
  9. if err = db.Ping(); err != nil {
  10. log.Fatalf("could not ping to database: %v\n", err)
  11. }
  12.  
  13. router := way.NewRouter()
  14. router.HandleFunc("POST", "/api/users", jsonRequired(createUser))
  15. router.HandleFunc("POST", "/api/passwordless/start", jsonRequired(passwordlessStart))
  16. router.HandleFunc("GET", "/api/passwordless/verify_redirect", passwordlessVerifyRedirect)
  17. router.Handle("GET", "/api/auth_user", authRequired(getAuthUser))
  18.  
  19. addr := fmt.Sprintf(":%d", config.port)
  20. log.Printf("starting server at %s  
責任編輯:龐桂玉 來源: Linux中國
相關推薦

2013-05-29 14:27:40

2019-04-30 10:27:46

無服務器云計算安全

2016-03-17 10:20:57

2021-03-26 14:30:54

安全服務器架構的安全

2018-02-24 10:15:36

無服務器容器云計算

2010-05-18 10:32:14

IIS服務器

2009-03-04 06:37:00

2019-09-20 15:05:23

軟件數據庫硬件

2020-03-25 11:06:46

無服務器開源安全工具

2018-04-24 07:35:51

2009-07-22 18:55:29

2019-07-09 10:57:04

云計算無服務器計算開發

2010-05-19 15:00:37

IIS服務器

2022-01-05 09:28:31

無服務器計算服務器應用程序

2018-01-23 08:07:06

2009-02-27 15:15:00

2017-11-23 10:29:55

2023-01-12 07:57:26

2010-05-13 18:09:41

2010-04-22 15:24:36

郵件安全網絡加密服務器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美美女爱爱视频 | 欧美一区二区三区四区五区无卡码 | 欧美aaaaa | 九色视频网站 | 亚洲情视频 | 中文字幕中文字幕 | 一区二区三区在线播放 | 国产免费自拍 | 伊人激情网 | 欧美激情视频一区二区三区免费 | 久久久青草婷婷精品综合日韩 | 国产精品日韩欧美一区二区 | h视频在线播放 | 97超碰人人| 精品亚洲一区二区三区四区五区 | 羞羞视频网站免费观看 | 国产综合在线视频 | 久久久久国产精品一区三寸 | 日本久久网站 | 亚洲视频免费播放 | 日本黄色免费大片 | 亚洲精品一区二区三区中文字幕 | 91精品国产色综合久久 | 99精品在线 | 91视频一区 | 成人国产在线视频 | 日本天天色 | av在线免费不卡 | 亚洲精品久久久久久国产精华液 | 欧美中文一区 | 亚洲 欧美 日韩在线 | 国产成人啪免费观看软件 | 久久精品亚洲精品 | 国产精品网址 | 一级黄色毛片免费 | 日韩一区三区 | www.久久国产精品 | 精品伦精品一区二区三区视频 | 欧美精品一区三区 | 国产精品永久免费 | 国产成人叼嘿视频在线观看 |