Implement Indieauth for channels
This commit is contained in:
parent
89201c0178
commit
95ee593dd8
|
|
@ -35,6 +35,13 @@ type authResponse struct {
|
||||||
Me string `json:"me"`
|
Me string `json:"me"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type authTokenResponse struct {
|
||||||
|
Me string `json:"me"`
|
||||||
|
AccessToken string `json:"access_token"`
|
||||||
|
TokenType string `json:"token_type"`
|
||||||
|
Scope string `json:"scope"`
|
||||||
|
}
|
||||||
|
|
||||||
type indexPage struct {
|
type indexPage struct {
|
||||||
Session session
|
Session session
|
||||||
Baseurl string
|
Baseurl string
|
||||||
|
|
@ -55,11 +62,23 @@ type authPage struct {
|
||||||
Session session
|
Session session
|
||||||
Me string
|
Me string
|
||||||
ClientID string
|
ClientID string
|
||||||
Scope []string
|
Scope string
|
||||||
RedirectURI string
|
RedirectURI string
|
||||||
|
State string
|
||||||
Channels []microsub.Channel
|
Channels []microsub.Channel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type authRequest struct {
|
||||||
|
Me string `redis:"me"`
|
||||||
|
ClientID string `redis:"client_id"`
|
||||||
|
Scope string `redis:"scope"`
|
||||||
|
RedirectURI string `redis:"redirect_uri"`
|
||||||
|
State string `redis:"state"`
|
||||||
|
Code string `redis:"code"`
|
||||||
|
Channel string `redis:"channel"`
|
||||||
|
AccessToken string `redis:"access_token"`
|
||||||
|
}
|
||||||
|
|
||||||
func newMainHandler(backend *memoryBackend) (*mainHandler, error) {
|
func newMainHandler(backend *memoryBackend) (*mainHandler, error) {
|
||||||
h := &mainHandler{Backend: backend}
|
h := &mainHandler{Backend: backend}
|
||||||
|
|
||||||
|
|
@ -151,7 +170,7 @@ func verifyAuthCode(code, redirectURI, authEndpoint string) (bool, *authResponse
|
||||||
return true, &authResponse, nil
|
return true, &authResponse, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return false, nil, fmt.Errorf("ERROR: HTTP response code from authorization_endpoint (%s) %d \n", authEndpoint, resp.StatusCode)
|
return false, nil, fmt.Errorf("HTTP response code from authorization_endpoint (%s) %d", authEndpoint, resp.StatusCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
func isLoggedIn(backend *memoryBackend, sess *session) bool {
|
func isLoggedIn(backend *memoryBackend, sess *session) bool {
|
||||||
|
|
@ -333,19 +352,36 @@ func (h *mainHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
me := query.Get("me")
|
me := query.Get("me")
|
||||||
clientID := query.Get("client_id")
|
clientID := query.Get("client_id")
|
||||||
redirectURI := query.Get("redirect_uri")
|
redirectURI := query.Get("redirect_uri")
|
||||||
//state := query.Get("state")
|
state := query.Get("state")
|
||||||
scope := query.Get("scope")
|
scope := query.Get("scope")
|
||||||
if scope == "" {
|
if scope == "" {
|
||||||
scope = "create"
|
scope = "create"
|
||||||
}
|
}
|
||||||
// Save this ^^ in Redis based on me,client_id,redirect_uri
|
|
||||||
|
auth := authRequest{
|
||||||
|
Me: me,
|
||||||
|
ClientID: clientID,
|
||||||
|
RedirectURI: redirectURI,
|
||||||
|
Scope: scope,
|
||||||
|
State: state,
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = conn.Do("HMSET", redis.Args{}.Add("state:"+state).AddFlat(&auth)...)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save this ^^ in Redis
|
||||||
|
|
||||||
var page authPage
|
var page authPage
|
||||||
page.Session = sess
|
page.Session = sess
|
||||||
page.Me = me
|
page.Me = me
|
||||||
page.ClientID = clientID
|
page.ClientID = clientID
|
||||||
page.RedirectURI = redirectURI
|
page.RedirectURI = redirectURI
|
||||||
page.Scope = strings.Split(scope, " ")
|
page.Scope = scope
|
||||||
|
page.State = state
|
||||||
page.Channels, err = h.Backend.ChannelsGetList()
|
page.Channels, err = h.Backend.ChannelsGetList()
|
||||||
|
|
||||||
err = h.Templates.ExecuteTemplate(w, "auth.html", page)
|
err = h.Templates.ExecuteTemplate(w, "auth.html", page)
|
||||||
|
|
@ -426,7 +462,96 @@ func (h *mainHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
} else if r.URL.Path == "/auth/approve" {
|
} else if r.URL.Path == "/auth/approve" {
|
||||||
// create a code
|
// create a code
|
||||||
// and redirect
|
code := util.RandStringBytes(32)
|
||||||
|
state := r.FormValue("state")
|
||||||
|
channel := r.FormValue("channel")
|
||||||
|
log.Println(code, state, channel)
|
||||||
|
|
||||||
|
values, err := redis.Values(conn.Do("HGETALL", "state:"+state))
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var auth authRequest
|
||||||
|
err = redis.ScanStruct(values, &auth)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
auth.Code = code
|
||||||
|
auth.Channel = channel
|
||||||
|
_, err = conn.Do("HMSET", redis.Args{}.Add("code:"+code).AddFlat(&auth)...)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = conn.Do("EXPIRE", "code:"+code, 5*60)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
redirectURI, err := url.Parse(auth.RedirectURI)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Println(redirectURI)
|
||||||
|
q := redirectURI.Query()
|
||||||
|
q.Add("code", code)
|
||||||
|
q.Add("state", auth.State)
|
||||||
|
redirectURI.RawQuery = q.Encode()
|
||||||
|
|
||||||
|
log.Println(redirectURI)
|
||||||
|
http.Redirect(w, r, redirectURI.String(), 302)
|
||||||
|
return
|
||||||
|
} else if r.URL.Path == "/auth/token" {
|
||||||
|
//grantType := r.FormValue("grant_type")
|
||||||
|
code := r.FormValue("code")
|
||||||
|
//clientID := r.FormValue("client_id")
|
||||||
|
//redirectURI := r.FormValue("redirect_uri")
|
||||||
|
//me := r.FormValue("me")
|
||||||
|
|
||||||
|
values, err := redis.Values(conn.Do("HGETALL", "code:"+code))
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var auth authRequest
|
||||||
|
err = redis.ScanStruct(values, &auth)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
token := util.RandStringBytes(32)
|
||||||
|
_, err = conn.Do("HMSET", redis.Args{}.Add("token:"+token).AddFlat(&auth)...)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res := authTokenResponse{
|
||||||
|
Me: auth.Me,
|
||||||
|
AccessToken: token,
|
||||||
|
TokenType: "Bearer",
|
||||||
|
Scope: auth.Scope,
|
||||||
|
}
|
||||||
|
|
||||||
|
enc := json.NewEncoder(w)
|
||||||
|
err = enc.Encode(&res)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
fmt.Fprintf(w, "ERROR: %q", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@
|
||||||
|
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<form action="/auth/approve" method="post">
|
<form action="/auth/approve" method="post">
|
||||||
|
<input type="hidden" name="state" value="{{ .State }}" />
|
||||||
|
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label">Client ID</label>
|
<label class="label">Client ID</label>
|
||||||
|
|
@ -61,9 +62,7 @@
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label class="label">Scope</label>
|
<label class="label">Scope</label>
|
||||||
<div class="control">
|
<div class="control">
|
||||||
{{ range .Scope }}
|
<p>{{ .Scope }}</p>
|
||||||
<p>{{ . }}</p>
|
|
||||||
{{ end }}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user