質問編集履歴

7

解決策修正

2020/10/02 08:10

投稿

kingcat
kingcat

スコア11

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
- // ShowLatestList 最近アップされた投稿取得する
607
+ //PostLogin ログイン処理行う
490
-
608
+
491
- func (pc PostListController) ShowLatestList(c *gin.Context) {
609
+ func (lg LoginController) PostLogin(c *gin.Context) {
610
+
492
-
611
+ var posteduser User
612
+
493
- var s service.PostListService
613
+ var s service.UserService
494
-
614
+
495
- auth.CheckTokenHandler(c) →tokenをgetするメソッドを呼びだす
615
+ if err := c.BindJSON(&posteduser); err != nil {
616
+
496
-
617
+ log.Println(err)
618
+
619
+ }
620
+
621
+
622
+
497
- p, err := s.GetLatestList()
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
- c.JSON(200, p)
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

解決方法訂正

2020/10/02 08:10

投稿

kingcat
kingcat

スコア11

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

解決案記入

2020/10/02 08:06

投稿

kingcat
kingcat

スコア11

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

質問修正

2020/10/02 08:04

投稿

kingcat
kingcat

スコア11

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

追加質問のため

2020/09/29 06:41

投稿

kingcat
kingcat

スコア11

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

より詳細な説明追加

2020/09/29 06:37

投稿

kingcat
kingcat

スコア11

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,10 @@
1
1
  ##困っていること
2
2
 
3
- GoでJWT認証の実装を試しているが、JWTを返却する際にエラー(panic)が発生してしまう。
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

個人情報を一部削除

2020/09/28 05:47

投稿

kingcat
kingcat

スコア11

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/namikitsubasa/go/src/sharechoco-go/auth/auth.go:37
131
+ /Users/go/src/sharechoco-go/auth/auth.go:37
132
132
 
133
133
  goapp/auth.glob..func1
134
134
 
135
- /Users/namikitsubasa/go/src/sharechoco-go/controller/login_controller.go:47
135
+ /Users/go/src/sharechoco-go/controller/login_controller.go:47
136
136
 
137
137
  goapp/controller.LoginController.PostLogin
138
138
 
139
- /Users/namikitsubasa/go/src/sharechoco-go/controller/login_controller.go:23
139
+ /Users/go/src/sharechoco-go/controller/login_controller.go:23
140
140
 
141
141
  goapp/controller.LoginController.PostLogin-fm
142
142
 
143
- /Users/namikitsubasa/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/context.go:147
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/namikitsubasa/go/pkg/mod/github.com/gin-contrib/sessions@v0.0.3/sessions.go:52
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/namikitsubasa/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/context.go:147
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/namikitsubasa/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/recovery.go:83
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/namikitsubasa/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/context.go:147
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/namikitsubasa/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/logger.go:241
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/namikitsubasa/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/context.go:147
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/namikitsubasa/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/gin.go:403
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/namikitsubasa/go/pkg/mod/github.com/gin-gonic/gin@v1.5.0/gin.go:364
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