From 312a523ee585837a59b28ffd250948c5525ec16f Mon Sep 17 00:00:00 2001 From: Fl_GUI Date: Mon, 28 Jul 2025 22:04:13 +0200 Subject: [PATCH] idk bunch of stuff --- client/client.go | 35 ++++++++++++++ client/doc.go | 2 + client/types.go | 14 ++++++ commontypes.go | 8 ++++ device/authorize.go | 1 + device/{return.go => returnTypes.go} | 0 go.mod | 3 -- implicit/config.go | 9 ++-- implicit/handler.go | 13 ++++-- implicit/implicit.go | 44 +++++++++++++++--- implicit/implicit.png | Bin 0 -> 41375 bytes implicit/implicit.puml | 67 +++++++++++++++++++++++++++ implicit/implicit_001.png | Bin 0 -> 48539 bytes implicit/implicit_test.go | 4 +- validate/poll.go | 21 +++++++++ validate/types.go | 9 ++++ validate/validate.go | 48 +++++++++++++++++++ x/device/main.go | 13 +++--- x/implicit/main.go | 2 +- 19 files changed, 266 insertions(+), 27 deletions(-) create mode 100644 client/client.go create mode 100644 client/doc.go create mode 100644 client/types.go create mode 100644 commontypes.go rename device/{return.go => returnTypes.go} (100%) delete mode 100644 go.mod create mode 100644 implicit/implicit.png create mode 100644 implicit/implicit.puml create mode 100644 implicit/implicit_001.png create mode 100644 validate/poll.go create mode 100644 validate/types.go create mode 100644 validate/validate.go diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..19c3d4f --- /dev/null +++ b/client/client.go @@ -0,0 +1,35 @@ +package client + +import ( + "encoding/json" + "net/http" + "net/url" + + "go.openfl.eu/twitch-api/auth" +) + +func Authenticate(c *Config) (Response, error) { + form := url.Values{} + form.Add("client_id", c.ClientId) + form.Add("client_secret", c.ClientSecret) + form.Add("grant_type", "client_credentials") + resp, err := http.PostForm("https://id.twitch.tv/oauth2/token", form) + + var response Response + if err != nil { + return response, err + } + + defer resp.Body.Close() + + err = json.NewDecoder(resp.Body).Decode(&response) + return response, err +} + +func (r Response) ToTokensource() auth.TokenSource { + source := make(chan auth.Token) + go func() { + source <- r.AccessToken + }() + return source +} diff --git a/client/doc.go b/client/doc.go new file mode 100644 index 0000000..0a0e073 --- /dev/null +++ b/client/doc.go @@ -0,0 +1,2 @@ +// implements https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/#client-credentials-grant-flow +package client diff --git a/client/types.go b/client/types.go new file mode 100644 index 0000000..20b9a3e --- /dev/null +++ b/client/types.go @@ -0,0 +1,14 @@ +package client + +import "go.openfl.eu/twitch-api/auth" + +type Config struct { + ClientId auth.ClientId + ClientSecret string +} + +type Response struct { + AccessToken auth.Token `json:"access_token"` + ExpiresIn uint `json:"expires_in"` + TokenType string `json:"bearer"` +} diff --git a/commontypes.go b/commontypes.go new file mode 100644 index 0000000..75f8ba7 --- /dev/null +++ b/commontypes.go @@ -0,0 +1,8 @@ +package auth + +type Token = string + +// Your client ID from https://dev.twitch.tv/docs/authentication/register-app/ +type ClientId = string + +type TokenSource <-chan Token diff --git a/device/authorize.go b/device/authorize.go index a1ab86b..b9da94a 100644 --- a/device/authorize.go +++ b/device/authorize.go @@ -10,6 +10,7 @@ import ( "time" ) +// see https://dev.twitch.tv/docs/authentication/getting-tokens-oauth/#device-code-grant-flow type Config struct { ClientId string Scopes []string diff --git a/device/return.go b/device/returnTypes.go similarity index 100% rename from device/return.go rename to device/returnTypes.go diff --git a/go.mod b/go.mod deleted file mode 100644 index c8adb90..0000000 --- a/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module go.openfl.eu/twitch-auth - -go 1.23.1 diff --git a/implicit/config.go b/implicit/config.go index 1b414ba..6825cec 100644 --- a/implicit/config.go +++ b/implicit/config.go @@ -1,10 +1,11 @@ package implicit +import "go.openfl.eu/twitch-api/auth" + type Config struct { - // Your client ID from https://dev.twitch.tv/docs/authentication/register-app/ - ClientId string - // The OAuth redirection url port. The full OAuth Redirect URL should be http://localhost: - Port string + ClientId auth.ClientId + // The OAuth redirection url. + Redirect string // Scopes from https://dev.twitch.tv/docs/authentication/scopes/ Scopes []string // Force the user to re-authorize your app diff --git a/implicit/handler.go b/implicit/handler.go index 5b61eba..0dcdcff 100644 --- a/implicit/handler.go +++ b/implicit/handler.go @@ -13,12 +13,17 @@ import ( var forwardPage []byte type Handler struct { - response chan AuthResponse + response chan AuthResponse + // optional pointer to http server pointer, which is initialized later. server **http.Server passThrough http.Handler state string } +func (h *Handler) GetResponse() <-chan AuthResponse { + return h.response +} + func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Redirect from twitch to forward.html if r.Method == http.MethodGet { @@ -48,8 +53,10 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } - close(h.response) - (*h.server).Close() + if h.server != nil { + close(h.response) + (*h.server).Close() + } } } diff --git a/implicit/implicit.go b/implicit/implicit.go index 686e747..5acbe43 100644 --- a/implicit/implicit.go +++ b/implicit/implicit.go @@ -8,13 +8,32 @@ import ( "net/http" "net/url" "strings" + + "go.openfl.eu/twitch-api/auth" ) +func ToTokenSource(response <-chan AuthResponse) (auth.TokenSource, <-chan error) { + tokens := make(chan auth.Token) + errors := make(chan error) + go func() { + for resp := range response { + if resp.Err != nil { + errors <- resp.Err + } else { + tokens <- auth.Token(resp.AccessCode) + } + } + }() + return tokens, errors +} + // See AuthenticateWithHandler func Authenticate(c *Config) (string, <-chan AuthResponse) { return AuthenticateWithHandler(c, &CloseHandler{}) } +// Get a url for a user to log into and the authentication response. +// // There will be none or one AuthResponse on the channel. // When there is one, the following actions are taken: // 1) The response is written to the channel @@ -22,8 +41,8 @@ func Authenticate(c *Config) (string, <-chan AuthResponse) { // 3) The channel is closed // 4) Internal resources are cleaned up // -// If your own handler is not a static page, redirect to your own server. -// By the time the handler's request is received, the server for the auth +// If your own handler is not a static page, redirect to your own server in the handler. +// By the time the handler's request is received by the browser, the server for the auth // flow will be closed. func AuthenticateWithHandler(c *Config, handler http.Handler) (string, <-chan AuthResponse) { responses := make(chan AuthResponse, 1) @@ -37,8 +56,7 @@ func AuthenticateWithHandler(c *Config, handler http.Handler) (string, <-chan Au }() var s *http.Server - s = &http.Server{Addr: c.Port, Handler: &Handler{responses, &s, handler, state}} - fmt.Println("listening on:", s.Addr) + s = &http.Server{Addr: c.Redirect, Handler: &Handler{responses, &s, handler, state}} err := s.ListenAndServe() if !errors.Is(err, http.ErrServerClosed) { responses <- AuthResponse{"", err} @@ -50,15 +68,27 @@ func AuthenticateWithHandler(c *Config, handler http.Handler) (string, <-chan Au return authUrl, responses } -func makeUrl(c *Config, state string) string { - redirectUrl := fmt.Sprintf("http://localhost%s", c.Port) +// Create a http handler that receives the access token by capturing +// the twitch redirect. +// +// The passThrough handler is used to present a page to the user +// after successful login. Defaults to CloseHandler when a nil value is given +func AuthenticationHandler(c *Config, passThrough http.Handler) (string, *Handler) { + responses := make(chan AuthResponse, 1) + if passThrough == nil { + passThrough = &CloseHandler{} + } + var state string = genState() + return makeUrl(c, state), &Handler{responses, nil, passThrough, state} +} +func makeUrl(c *Config, state string) string { query := make(url.Values) query.Add("client_id", c.ClientId) if c.ForceVerify { query.Add("force_verify", "true") } - query.Add("redirect_uri", redirectUrl) + query.Add("redirect_uri", c.Redirect) query.Add("response_type", "token") query.Add("scope", strings.Join(c.Scopes, " ")) query.Add("state", state) diff --git a/implicit/implicit.png b/implicit/implicit.png new file mode 100644 index 0000000000000000000000000000000000000000..5f700ab7b5d436ca1c8c22796808fa8d218031e1 GIT binary patch literal 41375 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 literal 0 HcmV?d00001 diff --git a/implicit/implicit.puml b/implicit/implicit.puml new file mode 100644 index 0000000..67cda55 --- /dev/null +++ b/implicit/implicit.puml @@ -0,0 +1,67 @@ +@startuml + +Title headless flow + +actor user +participant client +participant library +participant handler +participant server +participant browser +participant twitch + +client -> library: start authentication flow +library -> server: start server +library --> client: login URL +client -> user: present URL +user -> twitch: twitch login and grant flow +twitch --> browser: redirect with token +browser -> server: fetch page +server -> handler +handler --> browser +browser -> browser: put access token in html form +browser -> server: POST form with access token +server -> handler +handler -> handler: pass through handler +handler --> client: give access token +handler --> browser: pass through handler +handler -> server: stop server +@enduml + +@startuml +Title server flow + +actor user +participant client +participant library +participant handler +participant server +participant browser +participant twitch + +group setup +client -> library: create handler +library --> client +client -> server: add handler at URL +client -> server: start server +end +client -> user: present login +note left +The login url is the +exact url on which the +handler is registered +to the server +end note +user -> twitch: twitch login and grant flow +twitch --> browser: redirect with token +browser -> server: fetch page +server -> handler +handler --> browser +browser -> browser: put access token in html form +browser -> server: POST form with access token +server -> handler +handler -> handler: pass through +handler -> client: give access token +handler --> browser: pass through handler + +@enduml diff --git a/implicit/implicit_001.png b/implicit/implicit_001.png new file mode 100644 index 0000000000000000000000000000000000000000..1b24d501b61c8bc7dde7fdcc13ca70e773ea9d70 GIT binary patch literal 48539 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 v&Px3 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