example.go
· 2.2 KiB · Go
原始檔案
func webAuthUser() (string, string, error) {
resp, err := helpers.NewReq().Get("list/oauth2").Do()
if err != nil {
return "", "", errors.New("error occurred while getting OAuth2 URL: " + err.Error())
}
var oauth2Data types.OauthMeta
err = resp.Json(&oauth2Data)
if err != nil {
fmt.Print(helpers.RedText("Error parsing OAuth2 URL: " + err.Error()))
return "", "", err
}
// Open a http server on port 3000
srv := &http.Server{Addr: ":3000"}
go func() {
err := srv.ListenAndServe()
if err != http.ErrServerClosed {
log.Fatal(err)
}
}()
state := crypto.RandString(32)
fmt.Println("")
fmt.Println("")
fmt.Print(helpers.BlueText("Please open the following URL in your browser and follow the instructions:"))
fmt.Println("")
fmt.Println(strings.ReplaceAll(oauth2Data.URL, "%REDIRECT_URL%", "http://localhost:3000") + "&state=" + state)
// Wait for login
login := <-loginCh
fmt.Println("Got login code", login.code, "with state", login.state)
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
srv.Shutdown(ctx)
cancel()
if login.state != state {
time.Sleep(5 * time.Second)
return "", "", errors.New("invalid state, please try again")
}
// Exchange code for token
resp, err = helpers.NewReq().Put("users").Json(types.AuthorizeRequest{
ClientID: oauth2Data.ClientID,
Code: login.code,
Scope: "external_auth",
Nonce: "@external",
RedirectURI: "http://localhost:3000/auth/sauron",
}).Do()
if err != nil {
time.Sleep(5 * time.Second)
return "", "", errors.New("error occurred while exchanging code for token: " + err.Error())
}
if resp.Response.StatusCode != 200 {
fmt.Println("Login failed, got response code", resp.Response.StatusCode)
body, err := resp.Body()
if err != nil {
return "", "", errors.New("error occurred while parsing error when exchanging code for token: " + err.Error())
}
fmt.Println("Error body:", string(body))
return "", "", errors.New("login failed, got response code " + fmt.Sprint(resp.Response.StatusCode))
}
var loginData types.UserLogin
err = resp.Json(&loginData)
if err != nil {
return "", "", errors.New("error occurred while parsing login data: " + err.Error())
}
return loginData.UserID, loginData.Token, nil
}
1 | func webAuthUser() (string, string, error) { |
2 | resp, err := helpers.NewReq().Get("list/oauth2").Do() |
3 | |
4 | if err != nil { |
5 | return "", "", errors.New("error occurred while getting OAuth2 URL: " + err.Error()) |
6 | } |
7 | |
8 | var oauth2Data types.OauthMeta |
9 | |
10 | err = resp.Json(&oauth2Data) |
11 | |
12 | if err != nil { |
13 | fmt.Print(helpers.RedText("Error parsing OAuth2 URL: " + err.Error())) |
14 | return "", "", err |
15 | } |
16 | |
17 | // Open a http server on port 3000 |
18 | srv := &http.Server{Addr: ":3000"} |
19 | |
20 | go func() { |
21 | err := srv.ListenAndServe() |
22 | if err != http.ErrServerClosed { |
23 | log.Fatal(err) |
24 | } |
25 | }() |
26 | |
27 | state := crypto.RandString(32) |
28 | |
29 | fmt.Println("") |
30 | fmt.Println("") |
31 | fmt.Print(helpers.BlueText("Please open the following URL in your browser and follow the instructions:")) |
32 | fmt.Println("") |
33 | fmt.Println(strings.ReplaceAll(oauth2Data.URL, "%REDIRECT_URL%", "http://localhost:3000") + "&state=" + state) |
34 | |
35 | // Wait for login |
36 | login := <-loginCh |
37 | |
38 | fmt.Println("Got login code", login.code, "with state", login.state) |
39 | |
40 | ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) |
41 | |
42 | srv.Shutdown(ctx) |
43 | |
44 | cancel() |
45 | |
46 | if login.state != state { |
47 | time.Sleep(5 * time.Second) |
48 | return "", "", errors.New("invalid state, please try again") |
49 | } |
50 | |
51 | // Exchange code for token |
52 | resp, err = helpers.NewReq().Put("users").Json(types.AuthorizeRequest{ |
53 | ClientID: oauth2Data.ClientID, |
54 | Code: login.code, |
55 | Scope: "external_auth", |
56 | Nonce: "@external", |
57 | RedirectURI: "http://localhost:3000/auth/sauron", |
58 | }).Do() |
59 | |
60 | if err != nil { |
61 | time.Sleep(5 * time.Second) |
62 | return "", "", errors.New("error occurred while exchanging code for token: " + err.Error()) |
63 | } |
64 | |
65 | if resp.Response.StatusCode != 200 { |
66 | fmt.Println("Login failed, got response code", resp.Response.StatusCode) |
67 | |
68 | body, err := resp.Body() |
69 | |
70 | if err != nil { |
71 | return "", "", errors.New("error occurred while parsing error when exchanging code for token: " + err.Error()) |
72 | } |
73 | |
74 | fmt.Println("Error body:", string(body)) |
75 | return "", "", errors.New("login failed, got response code " + fmt.Sprint(resp.Response.StatusCode)) |
76 | } |
77 | |
78 | var loginData types.UserLogin |
79 | |
80 | err = resp.Json(&loginData) |
81 | |
82 | if err != nil { |
83 | return "", "", errors.New("error occurred while parsing login data: " + err.Error()) |
84 | } |
85 | |
86 | return loginData.UserID, loginData.Token, nil |
87 | } |