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}