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 return err 69 } 70 71 if iu.Hostname() != fetch_url.Hostname() { 72 return fmt.Errorf("issuer hostname does not match fetch url hostname") 73 } 74 75 if iu.Scheme != "https" { 76 return fmt.Errorf("issuer url is not https") 77 } 78 79 if iu.Port() != "" { 80 return fmt.Errorf("issuer port is not empty") 81 } 82 83 if iu.Path != "" && iu.Path != "/" { 84 return fmt.Errorf("issuer path is not /") 85 } 86 87 if iu.RawQuery != "" { 88 return fmt.Errorf("issuer url params are not empty") 89 } 90 91 if !tokenInSet("code", oam.ResponseTypesSupported) { 92 return fmt.Errorf("`code` is not in response_types_supported") 93 } 94 95 if !tokenInSet("authorization_code", oam.GrantTypesSupported) { 96 return fmt.Errorf("`authorization_code` is not in grant_types_supported") 97 } 98 99 if !tokenInSet("refresh_token", oam.GrantTypesSupported) { 100 return fmt.Errorf("`refresh_token` is not in grant_types_supported") 101 } 102 103 if !tokenInSet("S256", oam.CodeChallengeMethodsSupported) { 104 return fmt.Errorf("`S256` is not in code_challenge_methods_supported") 105 } 106 107 if !tokenInSet("none", oam.TokenEndpointAuthMethodsSupported) { 108 return fmt.Errorf("`none` is not in token_endpoint_auth_methods_supported") 109 } 110 111 if !tokenInSet("private_key_jwt", oam.TokenEndpointAuthMethodsSupported) { 112 return fmt.Errorf("`private_key_jwt` is not in token_endpoint_auth_methods_supported") 113 } 114 115 if !tokenInSet("ES256", oam.TokenEndpointAuthSigningAlgValuesSupported) { 116 return fmt.Errorf("`ES256` is not in token_endpoint_auth_signing_alg_values_supported") 117 } 118 119 if !tokenInSet("atproto", oam.ScopesSupported) { 120 return fmt.Errorf("`atproto` is not in scopes_supported") 121 } 122 123 if oam.AuthorizationResponseISSParameterSupported != true { 124 return fmt.Errorf("authorization_response_iss_parameter_supported is not true") 125 } 126 127 if oam.PushedAuthorizationRequestEndpoint == "" { 128 return fmt.Errorf("pushed_authorization_request_endpoint is empty") 129 } 130 131 if oam.RequirePushedAuthorizationRequests == false { 132 return fmt.Errorf("require_pushed_authorization_requests is false") 133 } 134 135 if !tokenInSet("ES256", oam.DpopSigningAlgValuesSupported) { 136 return fmt.Errorf("`ES256` is not in dpop_signing_alg_values_supported") 137 } 138 139 if oam.RequireRequestUriRegistration != nil && *oam.RequireRequestUriRegistration == false { 140 return fmt.Errorf("require_request_uri_registration present in metadata and was false") 141 } 142 143 if oam.ClientIDMetadataDocumentSupported == false { 144 return fmt.Errorf("client_id_metadata_document_supported was false") 145 } 146 147 return nil 148} 149 150func (oam *OauthAuthorizationMetadata) UnmarshalJSON(b []byte) error { 151 type Tmp OauthAuthorizationMetadata 152 var tmp Tmp 153 154 if err := json.Unmarshal(b, &tmp); err != nil { 155 return err 156 } 157 158 *oam = OauthAuthorizationMetadata(tmp) 159 160 return nil 161}