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