質問編集履歴
7
解決策修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -386,6 +386,124 @@
|
|
386
386
|
|
387
387
|
|
388
388
|
|
389
|
+
JWT認証を追加するメソッドを呼び出すクラス
|
390
|
+
|
391
|
+
```Go
|
392
|
+
|
393
|
+
package controller
|
394
|
+
|
395
|
+
|
396
|
+
|
397
|
+
import (
|
398
|
+
|
399
|
+
"fmt"
|
400
|
+
|
401
|
+
|
402
|
+
|
403
|
+
"goapp/models"
|
404
|
+
|
405
|
+
"goapp/service"
|
406
|
+
|
407
|
+
"log"
|
408
|
+
|
409
|
+
|
410
|
+
|
411
|
+
"github.com/gin-gonic/gin"
|
412
|
+
|
413
|
+
"golang.org/x/crypto/bcrypt"
|
414
|
+
|
415
|
+
)
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
// LoginController is Login controlller
|
420
|
+
|
421
|
+
type LoginController struct{}
|
422
|
+
|
423
|
+
|
424
|
+
|
425
|
+
// User is Login controlller
|
426
|
+
|
427
|
+
type User models.User
|
428
|
+
|
429
|
+
|
430
|
+
|
431
|
+
//PostLogin ログイン処理を行う
|
432
|
+
|
433
|
+
func (lg LoginController) PostLogin(c *gin.Context) {
|
434
|
+
|
435
|
+
var posteduser User
|
436
|
+
|
437
|
+
var s service.UserService
|
438
|
+
|
439
|
+
if err := c.BindJSON(&posteduser); err != nil {
|
440
|
+
|
441
|
+
log.Println(err)
|
442
|
+
|
443
|
+
}
|
444
|
+
|
445
|
+
|
446
|
+
|
447
|
+
user, err := s.GetByMailAddress(posteduser.MailAddress)
|
448
|
+
|
449
|
+
|
450
|
+
|
451
|
+
passCheckErr := passwordVerify(user.Password, posteduser.Password)
|
452
|
+
|
453
|
+
if passCheckErr != nil {
|
454
|
+
|
455
|
+
fmt.Println("パスワードが一致しません")
|
456
|
+
|
457
|
+
|
458
|
+
|
459
|
+
log.Println(err)
|
460
|
+
|
461
|
+
}
|
462
|
+
|
463
|
+
|
464
|
+
|
465
|
+
if err != nil {
|
466
|
+
|
467
|
+
c.AbortWithStatus(404)
|
468
|
+
|
469
|
+
fmt.Println(err)
|
470
|
+
|
471
|
+
fmt.Println("アドレスの登録がありません。")
|
472
|
+
|
473
|
+
} else if user.UserID != 0 {
|
474
|
+
|
475
|
+
log.Println("ログイン処理")
|
476
|
+
|
477
|
+
// var w http.ResponseWriter
|
478
|
+
|
479
|
+
// var r *http.Request
|
480
|
+
|
481
|
+
// →http.ResponseWriter *http.Request は初期化しない
|
482
|
+
|
483
|
+
auth.GetTokenHandler(c) → tokenをgetするメソッドを呼ぶ
|
484
|
+
|
485
|
+
fmt.Println("ログイン成功")
|
486
|
+
|
487
|
+
}
|
488
|
+
|
489
|
+
|
490
|
+
|
491
|
+
}
|
492
|
+
|
493
|
+
|
494
|
+
|
495
|
+
func passwordVerify(hash, pw string) error {
|
496
|
+
|
497
|
+
return bcrypt.CompareHashAndPassword([]byte(hash), []byte(pw))
|
498
|
+
|
499
|
+
}
|
500
|
+
|
501
|
+
|
502
|
+
|
503
|
+
```
|
504
|
+
|
505
|
+
|
506
|
+
|
389
507
|
## 追加質問の解決策
|
390
508
|
|
391
509
|
tokenをgetするメソッド(authクラス)http.HandlerFuncの引数を
|
@@ -486,15 +604,39 @@
|
|
486
604
|
|
487
605
|
```Go
|
488
606
|
|
489
|
-
//
|
607
|
+
//PostLogin ログイン処理を行う
|
490
|
-
|
608
|
+
|
491
|
-
func (
|
609
|
+
func (lg LoginController) PostLogin(c *gin.Context) {
|
610
|
+
|
492
|
-
|
611
|
+
var posteduser User
|
612
|
+
|
493
|
-
var s service.
|
613
|
+
var s service.UserService
|
494
|
-
|
614
|
+
|
495
|
-
|
615
|
+
if err := c.BindJSON(&posteduser); err != nil {
|
616
|
+
|
496
|
-
|
617
|
+
log.Println(err)
|
618
|
+
|
619
|
+
}
|
620
|
+
|
621
|
+
|
622
|
+
|
497
|
-
|
623
|
+
user, err := s.GetByMailAddress(posteduser.MailAddress)
|
624
|
+
|
625
|
+
|
626
|
+
|
627
|
+
passCheckErr := passwordVerify(user.Password, posteduser.Password)
|
628
|
+
|
629
|
+
if passCheckErr != nil {
|
630
|
+
|
631
|
+
fmt.Println("パスワードが一致しません")
|
632
|
+
|
633
|
+
|
634
|
+
|
635
|
+
log.Println(err)
|
636
|
+
|
637
|
+
}
|
638
|
+
|
639
|
+
|
498
640
|
|
499
641
|
if err != nil {
|
500
642
|
|
@@ -502,12 +644,20 @@
|
|
502
644
|
|
503
645
|
fmt.Println(err)
|
504
646
|
|
647
|
+
fmt.Println("アドレスの登録がありません。")
|
648
|
+
|
505
|
-
} else {
|
649
|
+
} else if user.UserID != 0 {
|
506
|
-
|
650
|
+
|
507
|
-
|
651
|
+
log.Println("ログイン処理")
|
652
|
+
|
508
|
-
|
653
|
+
auth.GetTokenHandler(c) → tokenをgetするメソッドを呼ぶ
|
654
|
+
|
655
|
+
fmt.Println("ログイン成功")
|
656
|
+
|
509
|
-
}
|
657
|
+
}
|
510
|
-
|
658
|
+
|
659
|
+
|
660
|
+
|
511
|
-
}
|
661
|
+
}
|
512
|
-
|
662
|
+
|
513
|
-
```
|
663
|
+
```
|
6
解決方法訂正
test
CHANGED
File without changes
|
test
CHANGED
@@ -390,7 +390,7 @@
|
|
390
390
|
|
391
391
|
tokenをgetするメソッド(authクラス)http.HandlerFuncの引数を
|
392
392
|
|
393
|
-
func(w http.ResponseWriter, r *http.Request→c *gin.Context
|
393
|
+
func(w http.ResponseWriter, r *http.Request){ → func(c *gin.Context) {
|
394
394
|
|
395
395
|
に変更することで解決
|
396
396
|
|
5
解決案記入
test
CHANGED
File without changes
|
test
CHANGED
@@ -318,6 +318,8 @@
|
|
318
318
|
|
319
319
|
rout := mux.NewRouter()の利用方法が誤っているのかと思いますが、どこがエラーの原因になっているかが分からず、お手数ですがよろしくお願い申し上げます。
|
320
320
|
|
321
|
+
|
322
|
+
|
321
323
|
```Go
|
322
324
|
|
323
325
|
func Init() {
|
@@ -375,3 +377,137 @@
|
|
375
377
|
https://qiita.com/stranger1989/items/7d95778d26d34fd1ddef
|
376
378
|
|
377
379
|
https://github.com/gorilla/mux
|
380
|
+
|
381
|
+
|
382
|
+
|
383
|
+
## 当初の質問の解決策
|
384
|
+
|
385
|
+
auth.GetTokenHandlerのメソッドをハンドラチェインの中で呼び出すことで解決
|
386
|
+
|
387
|
+
|
388
|
+
|
389
|
+
## 追加質問の解決策
|
390
|
+
|
391
|
+
tokenをgetするメソッド(authクラス)http.HandlerFuncの引数を
|
392
|
+
|
393
|
+
func(w http.ResponseWriter, r *http.Request→c *gin.Context
|
394
|
+
|
395
|
+
に変更することで解決
|
396
|
+
|
397
|
+
*webフレームワークGinを利用していたためw http.ResponseWriter, r *http.Requestの代わりにc *gin.Contextを利用
|
398
|
+
|
399
|
+
|
400
|
+
|
401
|
+
```Go
|
402
|
+
|
403
|
+
package auth
|
404
|
+
|
405
|
+
|
406
|
+
|
407
|
+
import (
|
408
|
+
|
409
|
+
"fmt"
|
410
|
+
|
411
|
+
"net/http"
|
412
|
+
|
413
|
+
"os"
|
414
|
+
|
415
|
+
"time"
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
jwtmiddleware "github.com/auth0/go-jwt-middleware"
|
420
|
+
|
421
|
+
jwt "github.com/dgrijalva/jwt-go"
|
422
|
+
|
423
|
+
"github.com/joho/godotenv"
|
424
|
+
|
425
|
+
)
|
426
|
+
|
427
|
+
|
428
|
+
|
429
|
+
//var GetTokenHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
430
|
+
|
431
|
+
//→var GetTokenHandler = func(c *gin.Context) {に変更することで解決
|
432
|
+
|
433
|
+
|
434
|
+
|
435
|
+
// GetTokenHandler get token
|
436
|
+
|
437
|
+
var GetTokenHandler = func(c *gin.Context) {
|
438
|
+
|
439
|
+
// headerのセット
|
440
|
+
|
441
|
+
token := jwt.New(jwt.SigningMethodHS256)
|
442
|
+
|
443
|
+
// claimsのセット
|
444
|
+
|
445
|
+
claims := token.Claims.(jwt.MapClaims)
|
446
|
+
|
447
|
+
claims["sub"] = "54546557354"
|
448
|
+
|
449
|
+
claims["name"] = "taro"
|
450
|
+
|
451
|
+
claims["iat"] = time.Now()
|
452
|
+
|
453
|
+
claims["exp"] = time.Now().Add(time.Hour * 24).Unix()
|
454
|
+
|
455
|
+
|
456
|
+
|
457
|
+
err := godotenv.Load("../.env")
|
458
|
+
|
459
|
+
if err != nil {
|
460
|
+
|
461
|
+
fmt.Println(err)
|
462
|
+
|
463
|
+
}
|
464
|
+
|
465
|
+
// 電子署名
|
466
|
+
|
467
|
+
tokenString, _ := token.SignedString([]byte(os.Getenv("SIGNINGKEY")))
|
468
|
+
|
469
|
+
fmt.Println(tokenString)
|
470
|
+
|
471
|
+
fmt.Println([]byte(tokenString))
|
472
|
+
|
473
|
+
// JWTを返却
|
474
|
+
|
475
|
+
w.Write([]byte(tokenString)) //ここでエラーが発生する
|
476
|
+
|
477
|
+
}
|
478
|
+
|
479
|
+
}
|
480
|
+
|
481
|
+
```
|
482
|
+
|
483
|
+
|
484
|
+
|
485
|
+
tokenをgetするメソッドを呼ぶメソッド
|
486
|
+
|
487
|
+
```Go
|
488
|
+
|
489
|
+
// ShowLatestList 最近アップされた投稿を取得する
|
490
|
+
|
491
|
+
func (pc PostListController) ShowLatestList(c *gin.Context) {
|
492
|
+
|
493
|
+
var s service.PostListService
|
494
|
+
|
495
|
+
auth.CheckTokenHandler(c) →tokenをgetするメソッドを呼びだす
|
496
|
+
|
497
|
+
p, err := s.GetLatestList()
|
498
|
+
|
499
|
+
if err != nil {
|
500
|
+
|
501
|
+
c.AbortWithStatus(404)
|
502
|
+
|
503
|
+
fmt.Println(err)
|
504
|
+
|
505
|
+
} else {
|
506
|
+
|
507
|
+
c.JSON(200, p)
|
508
|
+
|
509
|
+
}
|
510
|
+
|
511
|
+
}
|
512
|
+
|
513
|
+
```
|
4
質問修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -306,7 +306,7 @@
|
|
306
306
|
|
307
307
|
|
308
308
|
|
309
|
-
|
309
|
+
|
310
310
|
|
311
311
|
##追加の質問(上記エラーの解消法となるハンドラのチェインでメソッドを呼ぶ方法について)
|
312
312
|
|
@@ -316,6 +316,8 @@
|
|
316
316
|
|
317
317
|
まずはよりシンプルなケースで以下のコードを試してみたが、404エラーが発生してしまいました。
|
318
318
|
|
319
|
+
rout := mux.NewRouter()の利用方法が誤っているのかと思いますが、どこがエラーの原因になっているかが分からず、お手数ですがよろしくお願い申し上げます。
|
320
|
+
|
319
321
|
```Go
|
320
322
|
|
321
323
|
func Init() {
|
3
追加質問のため
test
CHANGED
File without changes
|
test
CHANGED
@@ -303,3 +303,73 @@
|
|
303
303
|
##参考にしているサイト
|
304
304
|
|
305
305
|
https://qiita.com/po3rin/items/740445d21487dfcb5d9f
|
306
|
+
|
307
|
+
|
308
|
+
|
309
|
+
///////////////////////////////////////////
|
310
|
+
|
311
|
+
##追加の質問(上記エラーの解消法となるハンドラのチェインでメソッドを呼ぶ方法について)
|
312
|
+
|
313
|
+
|
314
|
+
|
315
|
+
上記ケースのauth.GetTokenHandlerをハンドラのチェイン内で呼ぼうとしたが、上手くいかず、
|
316
|
+
|
317
|
+
まずはよりシンプルなケースで以下のコードを試してみたが、404エラーが発生してしまいました。
|
318
|
+
|
319
|
+
```Go
|
320
|
+
|
321
|
+
func Init() {
|
322
|
+
|
323
|
+
r := router()
|
324
|
+
|
325
|
+
|
326
|
+
|
327
|
+
r.Run(":3000")
|
328
|
+
|
329
|
+
rout := mux.NewRouter()
|
330
|
+
|
331
|
+
rout.HandleFunc("/", rootPage) →このパスをターミナルで叩くと404エラーになってしまう
|
332
|
+
|
333
|
+
}
|
334
|
+
|
335
|
+
|
336
|
+
|
337
|
+
func rootPage(w http.ResponseWriter, r *http.Request) {
|
338
|
+
|
339
|
+
fmt.Fprintf(w, "Welcome to the Go Api Server")
|
340
|
+
|
341
|
+
fmt.Println("Root endpoint is hooked!")
|
342
|
+
|
343
|
+
}
|
344
|
+
|
345
|
+
```
|
346
|
+
|
347
|
+
|
348
|
+
|
349
|
+
コンソール画面
|
350
|
+
|
351
|
+
```Go
|
352
|
+
|
353
|
+
[GIN-debug] Listening and serving HTTP on :3000
|
354
|
+
|
355
|
+
[GIN] 2020/09/29 - 14:44:18 | 404 | 14.537µs | ::1 | GET /
|
356
|
+
|
357
|
+
```
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
ターミナルで叩いたコマンド
|
362
|
+
|
363
|
+
curl http://localhost:3000/
|
364
|
+
|
365
|
+
|
366
|
+
|
367
|
+
|
368
|
+
|
369
|
+
|
370
|
+
|
371
|
+
参考にしたサイト
|
372
|
+
|
373
|
+
https://qiita.com/stranger1989/items/7d95778d26d34fd1ddef
|
374
|
+
|
375
|
+
https://github.com/gorilla/mux
|
2
より詳細な説明追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
##困っていること
|
2
2
|
|
3
|
-
GoでJWT認証の実装を試しているが、JWTを返却する際にエラー(
|
3
|
+
GoでJWT認証の実装を試しているが、JWTを返却する際(w.Write([]byte(tokenString)))にエラー(invalid memory address or nil pointer dereference)が発生してしまう。
|
4
|
+
|
4
|
-
|
5
|
+
*[]byte(tokenString))自体は値が入っていること確認済み(下記に詳細提示しております)
|
6
|
+
|
5
|
-
理想は、JWTをローカルストレージに保管したい。
|
7
|
+
理想は、w.Write([]byte(tokenString))実行時のエラーを解消しJWTをローカルストレージに保管したい。
|
6
8
|
|
7
9
|
|
8
10
|
|
1
個人情報を一部削除
test
CHANGED
File without changes
|
test
CHANGED
@@ -128,51 +128,51 @@
|
|
128
128
|
|
129
129
|
Last known immediate stacktrace (goroutine id 20):
|
130
130
|
|
131
|
-
/Users/
|
131
|
+
/Users/go/src/sharechoco-go/auth/auth.go:37
|
132
132
|
|
133
133
|
goapp/auth.glob..func1
|
134
134
|
|
135
|
-
/Users/
|
135
|
+
/Users/go/src/sharechoco-go/controller/login_controller.go:47
|
136
136
|
|
137
137
|
goapp/controller.LoginController.PostLogin
|
138
138
|
|
139
|
-
/Users/
|
139
|
+
/Users/go/src/sharechoco-go/controller/login_controller.go:23
|
140
140
|
|
141
141
|
goapp/controller.LoginController.PostLogin-fm
|
142
142
|
|
143
|
-
/Users/
|
143
|
+
/Users/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/context.go:147
|
144
144
|
|
145
145
|
github.com/gin-gonic/gin.(*Context).Next
|
146
146
|
|
147
|
-
/Users/
|
147
|
+
/Users/go/pkg/mod/github.com/gin-contrib/sessions@v0.0.3/sessions.go:52
|
148
148
|
|
149
149
|
github.com/gin-contrib/sessions.Sessions.func1
|
150
150
|
|
151
|
-
/Users/
|
151
|
+
/Users/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/context.go:147
|
152
152
|
|
153
153
|
github.com/gin-gonic/gin.(*Context).Next
|
154
154
|
|
155
|
-
/Users/
|
155
|
+
/Users/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/recovery.go:83
|
156
156
|
|
157
157
|
github.com/gin-gonic/gin.RecoveryWithWriter.func1
|
158
158
|
|
159
|
-
/Users/
|
159
|
+
/Users/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/context.go:147
|
160
160
|
|
161
161
|
github.com/gin-gonic/gin.(*Context).Next
|
162
162
|
|
163
|
-
/Users/
|
163
|
+
/Users/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/logger.go:241
|
164
164
|
|
165
165
|
github.com/gin-gonic/gin.LoggerWithConfig.func1
|
166
166
|
|
167
|
-
/Users/
|
167
|
+
/Users/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/context.go:147
|
168
168
|
|
169
169
|
github.com/gin-gonic/gin.(*Context).Next
|
170
170
|
|
171
|
-
/Users/
|
171
|
+
/Users/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/gin.go:403
|
172
172
|
|
173
173
|
github.com/gin-gonic/gin.(*Engine).handleHTTPRequest
|
174
174
|
|
175
|
-
/Users/
|
175
|
+
/Users/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/gin.go:364
|
176
176
|
|
177
177
|
github.com/gin-gonic/gin.(*Engine).ServeHTTP
|
178
178
|
|