Mercurial > public > pacobot
annotate cmd/auth.go @ 7:a8aab75f68c9
cmd/auth.go: refactor code
author | Dennis C. M. <dennis@denniscm.com> |
---|---|
date | Wed, 12 Mar 2025 14:45:00 +0000 |
parents | 4deabe76bd7f |
children |
rev | line source |
---|---|
6 | 1 package cmd |
2 | |
3 import ( | |
4 "encoding/json" | |
5 "log" | |
6 "net/http" | |
7 "net/url" | |
8 ) | |
9 | |
10 // TODO: Change unmarshall to JSON DECODE | |
11 | |
12 func GetAuthUrl() string { | |
13 config := readConfig() | |
14 | |
15 baseUrl := &url.URL{ | |
16 Scheme: "https", | |
17 Host: "id.twitch.tv", | |
18 Path: "/oauth2/authorize", | |
19 } | |
20 | |
21 params := url.Values{} | |
22 params.Add("client_id", config.ClientId) | |
23 params.Add("force_verify", "true") | |
24 params.Add("redirect_uri", "http://localhost:8080/twitch-auth-code-callback") | |
25 params.Add("response_type", "code") | |
26 params.Add("scope", "channel:bot user:read:chat") | |
27 params.Add("state", "c3ab8aa609ea11e793ae92361f002671") | |
28 | |
29 baseUrl.RawQuery = params.Encode() | |
30 | |
31 return baseUrl.String() | |
32 } | |
33 | |
34 type AuthRes struct { | |
35 AccessToken string `json:"access_token"` | |
36 RefreshToken string `json:"refresh_token"` | |
37 Scope []string `json:"scope"` | |
38 } | |
39 | |
40 func GetAuthToken(authCode string) AuthRes { | |
41 config := readConfig() | |
42 | |
43 baseUrl := &url.URL{ | |
44 Scheme: "https", | |
45 Host: "id.twitch.tv", | |
46 Path: "/oauth2/token", | |
47 } | |
48 | |
49 formData := url.Values{} | |
50 formData.Add("client_id", config.ClientId) | |
51 formData.Add("client_secret", config.ClientSecret) | |
52 formData.Add("code", authCode) | |
53 formData.Add("grant_type", "authorization_code") | |
54 formData.Add("redirect_uri", "http://localhost:8080/twitch-auth-code-callback") | |
55 | |
56 res, err := http.PostForm(baseUrl.String(), formData) | |
57 | |
58 if err != nil { | |
59 log.Fatal(err) | |
60 } | |
61 | |
62 defer res.Body.Close() | |
63 | |
64 if res.StatusCode != 200 { | |
65 log.Fatal("GetAuthToken") | |
66 } | |
67 | |
68 var authRes AuthRes | |
69 | |
70 err = json.NewDecoder(res.Body).Decode(&authRes) | |
71 | |
72 if err != nil { | |
73 log.Fatal(err) | |
74 } | |
75 | |
76 return authRes | |
77 } | |
78 | |
79 func IsAuthTokenValid(authToken string) bool { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
80 baseUrl := &url.URL{ |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
81 Scheme: "https", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
82 Host: "id.twitch.tv", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
83 Path: "oauth2/validate", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
84 } |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
85 |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
86 req, err := http.NewRequest("GET", baseUrl.String(), nil) |
6 | 87 |
88 if err != nil { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
89 log.Fatal(err) |
6 | 90 } |
91 | |
92 req.Header.Set("Authorization", "OAuth "+authToken) | |
93 | |
94 client := &http.Client{} | |
95 resp, err := client.Do(req) | |
96 | |
97 if err != nil { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
98 log.Fatal(err) |
6 | 99 } |
100 | |
101 defer resp.Body.Close() | |
102 | |
103 return resp.StatusCode == 200 | |
104 } | |
105 | |
106 func RevokeAuthToken(authToken string) { | |
107 config := readConfig() | |
108 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
109 baseUrl := &url.URL{ |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
110 Scheme: "https", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
111 Host: "id.twitch.tv", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
112 Path: "oauth2/revoke", |
6 | 113 } |
114 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
115 data := url.Values{} |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
116 data.Add("client_id", config.ClientId) |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
117 data.Add("token", authToken) |
6 | 118 |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
119 res, err := http.PostForm(baseUrl.String(), data) |
6 | 120 |
121 if err != nil { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
122 log.Fatal(err) |
6 | 123 } |
124 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
125 defer res.Body.Close() |
6 | 126 } |
127 | |
128 func RefreshAuthToken(authToken, refreshToken string) AuthRes { | |
129 config := readConfig() | |
130 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
131 baseUrl := &url.URL{ |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
132 Scheme: "https", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
133 Host: "id.twitch.tv", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
134 Path: "oauth2/token", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
135 } |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
136 |
6 | 137 data := url.Values{} |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
138 data.Add("grant_type", "refresh_token") |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
139 data.Add("refresh_token", refreshToken) |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
140 data.Add("client_id", config.ClientId) |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
141 data.Add("client_secret", config.ClientSecret) |
6 | 142 |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
143 res, err := http.PostForm(baseUrl.String(), data) |
6 | 144 |
145 if err != nil { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
146 log.Fatal(err) |
6 | 147 } |
148 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
149 defer res.Body.Close() |
6 | 150 |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
151 var authRes AuthRes |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
152 |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
153 err = json.NewDecoder(res.Body).Decode(&authRes) |
6 | 154 |
155 if err != nil { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
156 log.Fatal(err) |
6 | 157 } |
158 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
159 return authRes |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
160 } |
6 | 161 |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
162 type UserRes struct { |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
163 Data []struct { |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
164 Id string `json:"id"` |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
165 } `json:"data"` |
6 | 166 } |
167 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
168 func GetUser(userName, authToken string) UserRes { |
6 | 169 config := readConfig() |
170 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
171 baseUrl := &url.URL{ |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
172 Scheme: "https", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
173 Host: "api.twitch.tv", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
174 Path: "helix/users", |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
175 } |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
176 |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
177 params := url.Values{} |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
178 params.Add("login", userName) |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
179 |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
180 req, err := http.NewRequest("GET", baseUrl.String(), nil) |
6 | 181 |
182 if err != nil { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
183 log.Fatal(err) |
6 | 184 } |
185 | |
186 req.Header.Set("Client-ID", config.ClientId) | |
187 req.Header.Set("Authorization", "Bearer "+authToken) | |
188 | |
189 client := &http.Client{} | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
190 res, err := client.Do(req) |
6 | 191 |
192 if err != nil { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
193 log.Fatal(err) |
6 | 194 } |
195 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
196 defer res.Body.Close() |
6 | 197 |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
198 var userRes UserRes |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
199 |
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
200 err = json.NewDecoder(res.Body).Decode(&userRes) |
6 | 201 |
202 if err != nil { | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
203 log.Fatal(err) |
6 | 204 } |
205 | |
7
a8aab75f68c9
cmd/auth.go: refactor code
Dennis C. M. <dennis@denniscm.com>
parents:
6
diff
changeset
|
206 return userRes |
6 | 207 } |