this repo has no description
1package oauth 2 3import ( 4 "encoding/json" 5 "fmt" 6 "net/url" 7) 8 9type OauthProtectedResource struct { 10 Resource string `json:"resource"` 11 AuthorizationServers []string `json:"authorization_servers"` 12 ScopesSupported []string `json:"scopes_supported"` 13 BearerMethodsSupported []string `json:"bearer_methods_supported"` 14 ResourceDocumentation string `json:"resource_documentation"` 15} 16 17func (opr *OauthProtectedResource) UnmarshalJSON(b []byte) error { 18 type Tmp OauthProtectedResource 19 var tmp Tmp 20 21 if err := json.Unmarshal(b, &tmp); err != nil { 22 return err 23 } 24 25 *opr = OauthProtectedResource(tmp) 26 27 return nil 28} 29 30type OauthAuthorizationMetadata struct { 31 Issuer string `json:"issuer"` 32 RequestParameterSupported bool `json:"request_parameter_supported"` 33 RequestUriParameterSupported bool `json:"request_uri_parameter_supported"` 34 RequireRequestUriRegistration *bool `json:"require_request_uri_registration,omitempty"` 35 ScopesSupported []string `json:"scopes_supported"` 36 SubjectTypesSupported []string `json:"subject_types_supported"` 37 ResponseTypesSupported []string `json:"response_types_supported"` 38 ResponseModesSupported []string `json:"response_modes_supported"` 39 GrantTypesSupported []string `json:"grant_types_supported"` 40 CodeChallengeMethodsSupported []string `json:"code_challenge_methods_supported"` 41 UILocalesSupported []string `json:"ui_locales_supported"` 42 DisplayValuesSupported []string `json:"display_values_supported"` 43 RequestObjectSigningAlgValuesSupported []string `json:"request_object_signing_alg_values_supported"` 44 AuthorizationResponseISSParameterSupported bool `json:"authorization_response_iss_parameter_supported"` 45 RequestObjectEncryptionAlgValuesSupported []string `json:"request_object_encryption_alg_values_supported"` 46 RequestObjectEncryptionEncValuesSupported []string `json:"request_object_encryption_enc_values_supported"` 47 JwksUri string `json:"jwks_uri"` 48 AuthorizationEndpoint string `json:"authorization_endpoint"` 49 TokenEndpoint string `json:"token_endpoint"` 50 TokenEndpointAuthMethodsSupported []string `json:"token_endpoint_auth_methods_supported"` 51 TokenEndpointAuthSigningAlgValuesSupported []string `json:"token_endpoint_auth_signing_alg_values_supported"` 52 RevocationEndpoint string `json:"revocation_endpoint"` 53 IntrospectionEndpoint string `json:"introspection_endpoint"` 54 PushedAuthorizationRequestEndpoint string `json:"pushed_authorization_request_endpoint"` 55 RequirePushedAuthorizationRequests bool `json:"require_pushed_authorization_requests"` 56 DpopSigningAlgValuesSupported []string `json:"dpop_signing_alg_values_supported"` 57 ProtectedResources []string `json:"protected_resources"` 58 ClientIDMetadataDocumentSupported bool `json:"client_id_metadata_document_supported"` 59} 60 61func (oam *OauthAuthorizationMetadata) Validate(fetch_url *url.URL) error { 62 if fetch_url == nil { 63 return fmt.Errorf("fetch_url was nil") 64 } 65 66 iu, err := url.Parse(oam.Issuer) 67 if err != nil { 68 oam = nil 69 return err 70 } 71 72 if iu.Hostname() != fetch_url.Hostname() { 73 oam = nil 74 return fmt.Errorf("issuer hostname does not match fetch url hostname") 75 } 76 77 if iu.Scheme != "https" { 78 oam = nil 79 return fmt.Errorf("issuer url is not https") 80 } 81 82 if iu.Port() != "" { 83 oam = nil 84 return fmt.Errorf("issuer port is not empty") 85 } 86 87 if iu.Path != "" && iu.Path != "/" { 88 oam = nil 89 return fmt.Errorf("issuer path is not /") 90 } 91 92 if iu.RawQuery != "" { 93 oam = nil 94 return fmt.Errorf("issuer url params are not empty") 95 } 96 97 if !tokenInSet("code", oam.ResponseTypesSupported) { 98 oam = nil 99 return fmt.Errorf("`code` is not in response_types_supported") 100 } 101 102 if !tokenInSet("authorization_code", oam.GrantTypesSupported) { 103 oam = nil 104 return fmt.Errorf("`authorization_code` is not in grant_types_supported") 105 } 106 107 if !tokenInSet("refresh_token", oam.GrantTypesSupported) { 108 oam = nil 109 return fmt.Errorf("`refresh_token` is not in grant_types_supported") 110 } 111 112 if !tokenInSet("S256", oam.CodeChallengeMethodsSupported) { 113 oam = nil 114 return fmt.Errorf("`S256` is not in code_challenge_methods_supported") 115 } 116 117 if !tokenInSet("none", oam.TokenEndpointAuthMethodsSupported) { 118 oam = nil 119 return fmt.Errorf("`none` is not in token_endpoint_auth_methods_supported") 120 } 121 122 if !tokenInSet("private_key_jwt", oam.TokenEndpointAuthMethodsSupported) { 123 oam = nil 124 return fmt.Errorf("`private_key_jwt` is not in token_endpoint_auth_methods_supported") 125 } 126 127 if !tokenInSet("ES256", oam.TokenEndpointAuthSigningAlgValuesSupported) { 128 oam = nil 129 return fmt.Errorf("`ES256` is not in token_endpoint_auth_signing_alg_values_supported") 130 } 131 132 if !tokenInSet("atproto", oam.ScopesSupported) { 133 oam = nil 134 return fmt.Errorf("`atproto` is not in scopes_supported") 135 } 136 137 if oam.AuthorizationResponseISSParameterSupported != true { 138 oam = nil 139 return fmt.Errorf("authorization_response_iss_parameter_supported is not true") 140 } 141 142 if oam.PushedAuthorizationRequestEndpoint == "" { 143 oam = nil 144 return fmt.Errorf("pushed_authorization_request_endpoint is empty") 145 } 146 147 if oam.RequirePushedAuthorizationRequests == false { 148 oam = nil 149 return fmt.Errorf("require_pushed_authorization_requests is false") 150 } 151 152 if !tokenInSet("ES256", oam.DpopSigningAlgValuesSupported) { 153 oam = nil 154 return fmt.Errorf("`ES256` is not in dpop_signing_alg_values_supported") 155 } 156 157 if oam.RequireRequestUriRegistration != nil && *oam.RequireRequestUriRegistration == false { 158 oam = nil 159 return fmt.Errorf("require_request_uri_registration present in metadata and was false") 160 } 161 162 if oam.ClientIDMetadataDocumentSupported == false { 163 oam = nil 164 return fmt.Errorf("client_id_metadata_document_supported was false") 165 } 166 167 return nil 168} 169 170func (oam *OauthAuthorizationMetadata) UnmarshalJSON(b []byte) error { 171 type Tmp OauthAuthorizationMetadata 172 var tmp Tmp 173 174 if err := json.Unmarshal(b, &tmp); err != nil { 175 return err 176 } 177 178 *oam = OauthAuthorizationMetadata(tmp) 179 180 return nil 181}