main
 1package web
 2
 3import (
 4	"fmt"
 5	"net/http"
 6
 7	"github.com/hashicorp/uuid"
 8	"mokhan.ca/xlgmokha/idp/pkg/dto"
 9)
10
11func (h *HttpContext) Authorize(w http.ResponseWriter, r *http.Request) {
12	if r.Method == "GET" {
13		responseType := r.FormValue("response_type")
14		if responseType == "code" {
15			// Authorization Code Flow https://openid.net/specs/openid-connect-core-1_0.html#CodeFlowAuth
16			ar := &dto.AuthorizationRequest{
17				ResponseType: r.FormValue("response_type"),
18				Scope:        r.FormValue("scope"),
19				ClientId:     r.FormValue("client_id"),
20				State:        r.FormValue("state"),
21				RedirectUri:  r.FormValue("redirect_uri"),
22			}
23			code := uuid.GenerateUUID()
24			tokens[code] = uuid.GenerateUUID()
25			url := fmt.Sprintf("%s?code=%s&state=%s", ar.RedirectUri, code, ar.State)
26			http.Redirect(w, r, url, 302)
27		} else if responseType == "id_token token" || responseType == "id_token" {
28			// Implicit Flow https://openid.net/specs/openid-connect-core-1_0.html#ImplicitFlowAuth
29			ar := &dto.AuthorizationRequest{
30				ResponseType: r.FormValue("response_type"),
31				RedirectUri:  r.FormValue("redirect_uri"),
32				Nonce:        r.FormValue("nonce"),
33			}
34			idToken := h.createIdToken(r.FormValue("client_id"))
35			url := fmt.Sprintf("%s?access_token=example&token_type=bearer&id_token=%s&expires_in=3600&state=%s", ar.RedirectUri, idToken, ar.State)
36			http.Redirect(w, r, url, 302)
37		} else if responseType == "code id_token" || responseType == "code token" || responseType == "code id_token token" {
38			// Hybrid Flow https://openid.net/specs/openid-connect-core-1_0.html#HybridFlowAuth
39			w.WriteHeader(http.StatusNotImplemented)
40		} else {
41			w.WriteHeader(http.StatusNotFound)
42			fmt.Fprintf(w, "Not Found\n")
43		}
44	}
45}