Christopher James Hayward
1 year ago
2 changed files with 162 additions and 0 deletions
@ -0,0 +1,48 @@ |
|||||
|
package main |
||||
|
|
||||
|
import ( |
||||
|
"flag" |
||||
|
"fmt" |
||||
|
"net/http" |
||||
|
|
||||
|
"git.chrishayward.xyz/x/users/gateway" |
||||
|
"git.chrishayward.xyz/x/users/proto" |
||||
|
"google.golang.org/grpc" |
||||
|
) |
||||
|
|
||||
|
var ( |
||||
|
port = flag.Int("port", 8081, "--port=8081") |
||||
|
serverAddr = flag.String("serverAddr", "localhost", "--serverAddr=localhost") |
||||
|
serverPort = flag.Int("serverPort", 8080, "--serverPort=8080") |
||||
|
serverSecret = flag.String("serverSecret", "...", "--serverSecret=...") |
||||
|
) |
||||
|
|
||||
|
func main() { |
||||
|
// Parse the optional flags.
|
||||
|
flag.Parse() |
||||
|
|
||||
|
// Create the connection to the server.
|
||||
|
conn, err := grpc.Dial(fmt.Sprintf("%s:%d", *serverAddr, *serverPort)) |
||||
|
if err != nil { |
||||
|
fmt.Printf("Failed to connect: %v", err) |
||||
|
} |
||||
|
|
||||
|
// Defer closing the connection.
|
||||
|
defer conn.Close() |
||||
|
|
||||
|
// Create the client.
|
||||
|
client := proto.NewUsersClient(conn) |
||||
|
|
||||
|
// Setup HTTP endpoints.
|
||||
|
http.HandleFunc("/register", gateway.Register(client)) |
||||
|
http.HandleFunc("/login", gateway.Login(client)) |
||||
|
http.HandleFunc("/authorize", gateway.Authorize(client, serverSecret)) |
||||
|
http.HandleFunc("/reset_password", gateway.ResetPassword(client)) |
||||
|
http.HandleFunc("/change_password", gateway.ChangePassword(client)) |
||||
|
|
||||
|
// Listen for requests.
|
||||
|
fmt.Printf("Forwarding from :%d to %s:%d", *port, *serverAddr, *serverPort) |
||||
|
if err := http.ListenAndServe(fmt.Sprintf(":%d", *port), nil); err != nil { |
||||
|
fmt.Printf("Failed to listen: %v", err) |
||||
|
} |
||||
|
} |
@ -0,0 +1,114 @@ |
|||||
|
package gateway |
||||
|
|
||||
|
import ( |
||||
|
"fmt" |
||||
|
"net/http" |
||||
|
|
||||
|
"git.chrishayward.xyz/x/users/proto" |
||||
|
) |
||||
|
|
||||
|
func Register(client proto.UsersClient) http.HandlerFunc { |
||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||
|
password, passwordAgain := |
||||
|
r.URL.Query().Get("password"), |
||||
|
r.URL.Query().Get("password_again") |
||||
|
_, err := client.Register(r.Context(), &proto.RegisterRequest{ |
||||
|
Form: &proto.UserForm{ |
||||
|
Email: r.URL.Query().Get("email"), |
||||
|
Password: &password, |
||||
|
PasswordAgain: &passwordAgain, |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
if err != nil { |
||||
|
w.WriteHeader(http.StatusBadRequest) |
||||
|
w.Write([]byte(err.Error())) |
||||
|
} |
||||
|
|
||||
|
w.WriteHeader(http.StatusOK) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
func Login(client proto.UsersClient) http.HandlerFunc { |
||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||
|
password, passwordAgain := |
||||
|
r.URL.Query().Get("password"), |
||||
|
r.URL.Query().Get("password_again") |
||||
|
res, err := client.Login(r.Context(), &proto.LoginRequest{ |
||||
|
Form: &proto.UserForm{ |
||||
|
Email: r.URL.Query().Get("email"), |
||||
|
Password: &password, |
||||
|
PasswordAgain: &passwordAgain, |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
if err != nil { |
||||
|
w.WriteHeader(http.StatusBadRequest) |
||||
|
w.Write([]byte(err.Error())) |
||||
|
} |
||||
|
|
||||
|
w.WriteHeader(http.StatusOK) |
||||
|
w.Write([]byte(res.Token.Token)) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
func Authorize(client proto.UsersClient, serverSecret *string) http.HandlerFunc { |
||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||
|
res, err := client.Authorize(r.Context(), &proto.AuthorizeRequest{ |
||||
|
Secret: *serverSecret, |
||||
|
Token: &proto.UserToken{ |
||||
|
Token: r.URL.Query().Get("token"), |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
if err != nil { |
||||
|
w.WriteHeader(http.StatusBadRequest) |
||||
|
w.Write([]byte(err.Error())) |
||||
|
} |
||||
|
|
||||
|
w.WriteHeader(http.StatusOK) |
||||
|
w.Write([]byte(fmt.Sprintf("%d", res.User.Id))) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
func ResetPassword(client proto.UsersClient) http.HandlerFunc { |
||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||
|
res, err := client.ResetPassword(r.Context(), &proto.ResetPasswordRequest{ |
||||
|
Form: &proto.UserForm{ |
||||
|
Email: r.URL.Query().Get("email"), |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
if err != nil { |
||||
|
w.WriteHeader(http.StatusBadRequest) |
||||
|
w.Write([]byte(err.Error())) |
||||
|
} |
||||
|
|
||||
|
w.WriteHeader(http.StatusOK) |
||||
|
w.Write([]byte(fmt.Sprintf( |
||||
|
"Please follow this link to update your password: http://localhost:%d/change_password?token=%s\n", |
||||
|
*port, res.Token.Token))) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
func ChangePassword(client proto.UsersClient) http.HandlerFunc { |
||||
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { |
||||
|
password, passwordAgain := |
||||
|
r.URL.Query().Get("password"), |
||||
|
r.URL.Query().Get("password_again") |
||||
|
_, err := client.ChangePassword(r.Context(), &proto.ChangePasswordRequest{ |
||||
|
Form: &proto.UserForm{ |
||||
|
Email: r.URL.Query().Get("email"), |
||||
|
Password: &password, |
||||
|
PasswordAgain: &passwordAgain, |
||||
|
}, |
||||
|
}) |
||||
|
|
||||
|
if err != nil { |
||||
|
w.WriteHeader(http.StatusBadRequest) |
||||
|
w.Write([]byte(err.Error())) |
||||
|
} |
||||
|
|
||||
|
w.WriteHeader(http.StatusOK) |
||||
|
}) |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue