1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
r.GET("/oauth/kakao/callback", func(c *gin.Context) {
// sessions 에 저장한 state 값 검증
session := sessions.Default(c)
state := c.Query("state")
if session.Get("oauth2-state") != state {
c.JSON(http.StatusForbidden, gin.H{
"message": "state code error",
})
}
session.Clear()
session.Save()
// 코드를 통해 인증 서버에서 토큰 획득
code := c.Query("code")
token, err := conf.Exchange(c, code)
if err != nil {
c.JSON(http.StatusForbidden, gin.H{
"message": err.Error(),
})
}
// 토큰을 통해 리소스 서버에서 사용자 정보 획득
req, err := http.NewRequest("GET", "https://kapi.kakao.com/v2/user/me", nil)
if err != nil {
c.JSON(http.StatusForbidden, gin.H{
"message": err.Error(),
})
}
req.Header.Add("Authorization", "Bearer "+token.AccessToken)
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
c.JSON(http.StatusForbidden, gin.H{
"message": err.Error(),
})
}
defer res.Body.Close()
bytes, err := ioutil.ReadAll(res.Body)
if err != nil {
c.JSON(http.StatusForbidden, gin.H{
"message": err.Error(),
})
}
var memberInfo KakaoMemberResponse
if err := json.Unmarshal(bytes, &memberInfo); err != nil {
c.JSON(http.StatusForbidden, gin.H{
"message": err.Error(),
})
}
// do stuff with memberInfo and get token
fmt.Println(memberInfo)
c.SetCookie("token", "tokenLikeString", 3000, "/", "localhost:8080", true, false)
c.Redirect(http.StatusFound, "/success")
})
|