質問編集履歴

1

トークンの生成方法を追加

2021/03/01 00:49

投稿

BraveDragon
BraveDragon

スコア15

test CHANGED
File without changes
test CHANGED
@@ -28,6 +28,172 @@
28
28
 
29
29
  - 上記の1. 2. 3.の問題を解決し、認証トークンとリクエストヘッダ内のx-tokenの照合処理を完成させたい。
30
30
 
31
+ - トークンの生成方法は以下の通りとなる。
32
+
33
+ 0. 新規ユーザー登録時、ユーザー名をパスパラメーターから取得する。
34
+
35
+ 0. ユーザー名とは別に、ユーザーIDをUUIDで生成する。生成にはUUIDを扱うライブラリであるgoogle/uuidを使用する。
36
+
37
+ 0. トークンの有効期限を設定するため、現在の時刻を取得する。
38
+
39
+ 0. ユーザーIDをシードとして秘密鍵を生成。
40
+
41
+ 0. PASETOを扱うライブラリであるo1egl/pasetoを利用してPASETO用のトークンペイロードクレーム(token payload claim)を生成する。この時、トークンの有効期限を3.で取得した現在時刻から30分後までとする。
42
+
43
+ 0. footerに文字列"FOOTER"を設定する。
44
+
45
+ 0. 秘密鍵、トークンペイロードクレーム、footerを元に認証トークンを生成する。
46
+
47
+ 0. ユーザー情報を管理するDBのテーブルであるUserテーブルをマッピングした構造体UserにユーザーID、ユーザー名、認証トークンを格納し、それをDBに追加して反映させる。・
48
+
49
+
50
+
51
+ - 以上の処理のソースコードは以下の通りとなる。
52
+
53
+ ```Go
54
+
55
+ package main
56
+
57
+
58
+
59
+ import (
60
+
61
+ "database/sql"
62
+
63
+ "net/http"
64
+
65
+
66
+
67
+ "crypto/ed25519"
68
+
69
+ "encoding/hex"
70
+
71
+ "time"
72
+
73
+
74
+
75
+ "github.com/go-gorp/gorp"
76
+
77
+ "github.com/google/uuid"
78
+
79
+ "github.com/gorilla/mux"
80
+
81
+ "github.com/gorilla/schema"
82
+
83
+ "github.com/o1egl/paseto"
84
+
85
+ )
86
+
87
+
88
+
89
+ //User : ユーザー情報を管理
90
+
91
+ type User struct {
92
+
93
+ id string `db:"ID, primarykey` //ユーザーID
94
+
95
+ name string `db:"name"` //ユーザー名
96
+
97
+ token string `db:"token"` //認証トークン
98
+
99
+
100
+
101
+ }
102
+
103
+
104
+
105
+ //DB に接続
106
+
107
+ var DB, _ = sql.Open("mysql", "root:@APIDB")
108
+
109
+ var DBMap = &gorp.DbMap{Db: DB, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}
110
+
111
+
112
+
113
+ //ユーザー作成を行う
114
+
115
+ func userCreate(w http.ResponseWriter, r *http.Request) {
116
+
117
+ //パスパラメーターから新規ユーザー名を取得
118
+
119
+ value := mux.Vars(r)
120
+
121
+ w.WriteHeader(http.StatusOK)
122
+
123
+
124
+
125
+ //IDはUUIDで生成
126
+
127
+ UUID, _ := uuid.NewUUID()
128
+
129
+
130
+
131
+ now := time.Now()
132
+
133
+ //ここから認証トークン生成部
134
+
135
+ //ユーザーIDから秘密鍵生成用のシードを生成
136
+
137
+ b, _ := hex.DecodeString(newUser.id)
138
+
139
+ privateKey := ed25519.PrivateKey(b)
140
+
141
+ jsonToken := paseto.JSONToken{
142
+
143
+ Audience: "Audience",
144
+
145
+ Issuer: "Issuer",
146
+
147
+ Subject: "WebAPI",
148
+
149
+ Jti: "UUID",
150
+
151
+ Expiration: time.Now().Add(30 * time.Minute),
152
+
153
+ IssuedAt: now,
154
+
155
+ NotBefore: now,
156
+
157
+ }
158
+
159
+
160
+
161
+ jsonToken.Set("KEY", "VALUE")
162
+
163
+ footer := "FOOTER"
164
+
165
+ tokenCreator := paseto.NewV2()
166
+
167
+ //トークンを生成
168
+
169
+ token, _ := tokenCreator.Sign(privateKey, jsonToken, footer)
170
+
171
+
172
+
173
+ //新規ユーザー
174
+
175
+ newUser := User{}
176
+
177
+ newUser.name = value["name"]
178
+
179
+ newUser.id = UUID.String()
180
+
181
+ newUser.token = token
182
+
183
+ //DBに追加+反映
184
+
185
+ dbHandler, _ := DBMap.Begin()
186
+
187
+ dbHandler.Insert(newUser)
188
+
189
+ dbHandler.Commit()
190
+
191
+
192
+
193
+ }
194
+
195
+ ```
196
+
31
197
 
32
198
 
33
199