(t *testing.T)
| 190 | } |
| 191 | |
| 192 | func TestRequireBearerToken(t *testing.T) { |
| 193 | verifier := func(_ context.Context, token string, _ *http.Request) (*TokenInfo, error) { |
| 194 | if token == "valid" { |
| 195 | return &TokenInfo{Expiration: time.Now().Add(time.Hour), Scopes: []string{"read"}}, nil |
| 196 | } |
| 197 | return nil, ErrInvalidToken |
| 198 | } |
| 199 | |
| 200 | tests := []struct { |
| 201 | name string |
| 202 | opts *RequireBearerTokenOptions |
| 203 | authHeader string |
| 204 | wantHeader string |
| 205 | wantStatus int |
| 206 | }{ |
| 207 | { |
| 208 | name: "no middleware options", |
| 209 | opts: nil, |
| 210 | authHeader: "Bearer invalid", |
| 211 | wantHeader: "", |
| 212 | wantStatus: http.StatusUnauthorized, |
| 213 | }, |
| 214 | { |
| 215 | name: "metadata only", |
| 216 | opts: &RequireBearerTokenOptions{ |
| 217 | ResourceMetadataURL: "https://example.com/resource-metadata", |
| 218 | }, |
| 219 | authHeader: "Bearer invalid", |
| 220 | wantHeader: "Bearer resource_metadata=\"https://example.com/resource-metadata\"", |
| 221 | wantStatus: http.StatusUnauthorized, |
| 222 | }, |
| 223 | { |
| 224 | name: "scopes only", |
| 225 | opts: &RequireBearerTokenOptions{ |
| 226 | Scopes: []string{"read", "write"}, |
| 227 | }, |
| 228 | authHeader: "Bearer invalid", |
| 229 | wantHeader: "Bearer scope=\"read write\"", |
| 230 | wantStatus: http.StatusUnauthorized, |
| 231 | }, |
| 232 | { |
| 233 | name: "metadata and scopes", |
| 234 | opts: &RequireBearerTokenOptions{ |
| 235 | ResourceMetadataURL: "https://example.com/resource-metadata", |
| 236 | Scopes: []string{"read", "write"}, |
| 237 | }, |
| 238 | authHeader: "Bearer invalid", |
| 239 | wantHeader: "Bearer resource_metadata=\"https://example.com/resource-metadata\", scope=\"read write\"", |
| 240 | wantStatus: http.StatusUnauthorized, |
| 241 | }, |
| 242 | { |
| 243 | name: "insufficient scope", |
| 244 | opts: &RequireBearerTokenOptions{ |
| 245 | Scopes: []string{"admin"}, |
| 246 | }, |
| 247 | authHeader: "Bearer valid", // Has "read", needs "admin" -> 403 |
| 248 | wantHeader: "Bearer scope=\"admin\"", |
| 249 | wantStatus: http.StatusForbidden, |
nothing calls this directly
no test coverage detected
searching dependent graphs…