91 lines
2.1 KiB
Go
91 lines
2.1 KiB
Go
package http
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"source.toby3d.me/toby3d/auth/internal/domain"
|
|
"source.toby3d.me/toby3d/form"
|
|
)
|
|
|
|
type (
|
|
TicketGenerateRequest struct {
|
|
// The access token should be used when acting on behalf of this URL.
|
|
Subject domain.Me `form:"subject"`
|
|
|
|
// The access token will work at this URL.
|
|
Resource domain.URL `form:"resource"`
|
|
}
|
|
|
|
TicketExchangeRequest struct {
|
|
// The access token should be used when acting on behalf of this URL.
|
|
Subject domain.Me `form:"subject"`
|
|
|
|
// The access token will work at this URL.
|
|
Resource domain.URL `form:"resource"`
|
|
|
|
// A random string that can be redeemed for an access token.
|
|
Ticket string `form:"ticket"`
|
|
}
|
|
)
|
|
|
|
func (r *TicketGenerateRequest) bind(req *http.Request) error {
|
|
indieAuthError := new(domain.Error)
|
|
|
|
if err := req.ParseForm(); err != nil {
|
|
return domain.NewError(
|
|
domain.ErrorCodeInvalidRequest,
|
|
err.Error(),
|
|
"https://indieauth.net/source/#authorization-request",
|
|
)
|
|
}
|
|
|
|
if err := form.Unmarshal([]byte(req.PostForm.Encode()), r); err != nil {
|
|
if errors.As(err, indieAuthError) {
|
|
return indieAuthError
|
|
}
|
|
|
|
return domain.NewError(
|
|
domain.ErrorCodeInvalidRequest,
|
|
err.Error(),
|
|
"https://indieweb.org/IndieAuth_Ticket_Auth#Create_the_IndieAuth_ticket",
|
|
)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *TicketExchangeRequest) bind(req *http.Request) error {
|
|
indieAuthError := new(domain.Error)
|
|
|
|
if err := req.ParseForm(); err != nil {
|
|
return domain.NewError(
|
|
domain.ErrorCodeInvalidRequest,
|
|
err.Error(),
|
|
"https://indieauth.net/source/#authorization-request",
|
|
)
|
|
}
|
|
|
|
if err := form.Unmarshal([]byte(req.PostForm.Encode()), r); err != nil {
|
|
if errors.As(err, indieAuthError) {
|
|
return indieAuthError
|
|
}
|
|
|
|
return domain.NewError(
|
|
domain.ErrorCodeInvalidRequest,
|
|
err.Error(),
|
|
"https://indieweb.org/IndieAuth_Ticket_Auth#Create_the_IndieAuth_ticket",
|
|
)
|
|
}
|
|
|
|
if r.Ticket == "" {
|
|
return domain.NewError(
|
|
domain.ErrorCodeInvalidRequest,
|
|
"ticket parameter is required",
|
|
"https://indieweb.org/IndieAuth_Ticket_Auth#Create_the_IndieAuth_ticket",
|
|
)
|
|
}
|
|
|
|
return nil
|
|
}
|