IndieAuth #25

Merged
h4kor merged 19 commits from auth into master 2022-11-07 19:38:21 +00:00
4 changed files with 91 additions and 5 deletions
Showing only changes of commit da9111c186 - Show all commits

View File

@ -67,7 +67,48 @@ func userAuthHandler(repo *owl.Repository) func(http.ResponseWriter, *http.Reque
notFoundHandler(repo)(w, r) notFoundHandler(repo)(w, r)
return return
} }
html, err := owl.RenderUserAuthPage(user) // get me, cleint_id, redirect_uri, state and response_type from query
me := r.URL.Query().Get("me")
clientId := r.URL.Query().Get("client_id")
redirectUri := r.URL.Query().Get("redirect_uri")
state := r.URL.Query().Get("state")
responseType := r.URL.Query().Get("response_type")
// check if request is valid
missing_params := []string{}
if clientId == "" {
missing_params = append(missing_params, "client_id")
}
if redirectUri == "" {
missing_params = append(missing_params, "redirect_uri")
}
if responseType == "" {
missing_params = append(missing_params, "response_type")
}
if len(missing_params) > 0 {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(fmt.Sprintf("Missing parameters: %s", strings.Join(missing_params, ", "))))
return
}
if responseType != "id" {
responseType = "code"
}
if responseType != "code" {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte("Invalid response_type. Must be 'code' ('id' converted to 'code' for legacy support)."))
return
}
reqData := owl.AuthRequestData{
Me: me,
ClientId: clientId,
RedirectUri: redirectUri,
State: state,
ResponseType: responseType,
User: user,
}
html, err := owl.RenderUserAuthPage(reqData)
if err != nil { if err != nil {
println("Error rendering auth page: ", err.Error()) println("Error rendering auth page: ", err.Error())
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)

View File

@ -1,5 +1,11 @@
<h2>Authorization for {{.ClientId}}</h2>
<form action="" method="post"> <form action="" method="post">
<label for="password">Password</label> <label for="password">Password</label>
<input type="password" name="password" placeholder="Password"> <input type="password" name="password" placeholder="Password">
<input type="hidden" name="client_id" value="{{.ClientId}}">
<input type="hidden" name="redirect_uri" value="{{.RedirectUri}}">
<input type="hidden" name="response_type" value="{{.ResponseType}}">
<input type="hidden" name="state" value="{{.State}}">
<input type="submit" value="Login"> <input type="submit" value="Login">
</form> </form>

View File

@ -20,6 +20,15 @@ type PostRenderData struct {
Content template.HTML Content template.HTML
} }
type AuthRequestData struct {
Me string
ClientId string
RedirectUri string
State string
ResponseType string
User User
}
func renderEmbedTemplate(templateFile string, data interface{}) (string, error) { func renderEmbedTemplate(templateFile string, data interface{}) (string, error) {
templateStr, err := embed_files.ReadFile(templateFile) templateStr, err := embed_files.ReadFile(templateFile)
if err != nil { if err != nil {
@ -109,13 +118,13 @@ func RenderIndexPage(user User) (string, error) {
}) })
} }
func RenderUserAuthPage(user User) (string, error) { func RenderUserAuthPage(reqData AuthRequestData) (string, error) {
authHtml, err := renderEmbedTemplate("embed/auth.html", user) authHtml, err := renderEmbedTemplate("embed/auth.html", reqData)
if err != nil { if err != nil {
return "", err return "", err
} }
return renderIntoBaseTemplate(user, PageContent{ return renderIntoBaseTemplate(reqData.User, PageContent{
Title: "Auth", Title: "Auth",
Content: template.HTML(authHtml), Content: template.HTML(authHtml),
}) })

View File

@ -289,7 +289,37 @@ func TestAddFaviconIfExist(t *testing.T) {
func TestRenderUserAuth(t *testing.T) { func TestRenderUserAuth(t *testing.T) {
user := getTestUser() user := getTestUser()
user.ResetPassword("test") user.ResetPassword("test")
result, err := owl.RenderUserAuthPage(user) result, err := owl.RenderUserAuthPage(owl.AuthRequestData{
User: user,
})
assertions.AssertNoError(t, err, "Error rendering user auth page") assertions.AssertNoError(t, err, "Error rendering user auth page")
assertions.AssertContains(t, result, "<form") assertions.AssertContains(t, result, "<form")
} }
func TestRenderUserAuthIncludesClientId(t *testing.T) {
user := getTestUser()
user.ResetPassword("test")
result, err := owl.RenderUserAuthPage(owl.AuthRequestData{
User: user,
ClientId: "https://example.com/",
})
assertions.AssertNoError(t, err, "Error rendering user auth page")
assertions.AssertContains(t, result, "https://example.com/")
}
func TestRenderUserAuthHiddenFields(t *testing.T) {
user := getTestUser()
user.ResetPassword("test")
result, err := owl.RenderUserAuthPage(owl.AuthRequestData{
User: user,
ClientId: "https://example.com/",
RedirectUri: "https://example.com/redirect",
ResponseType: "code",
State: "teststate",
})
assertions.AssertNoError(t, err, "Error rendering user auth page")
assertions.AssertContains(t, result, "name=\"client_id\" value=\"https://example.com/\"")
assertions.AssertContains(t, result, "name=\"redirect_uri\" value=\"https://example.com/redirect\"")
assertions.AssertContains(t, result, "name=\"response_type\" value=\"code\"")
assertions.AssertContains(t, result, "name=\"state\" value=\"teststate\"")
}