GetTokenFromHeaders extracts the access token from HTTP headers for ConnectRPC.
(headers http.Header)
| 334 | |
| 335 | // GetTokenFromHeaders extracts the access token from HTTP headers for ConnectRPC. |
| 336 | func GetTokenFromHeaders(headers http.Header) (string, error) { |
| 337 | // Check Authorization header first |
| 338 | authHeader := headers.Get("Authorization") |
| 339 | if authHeader != "" { |
| 340 | authHeaderParts := strings.Fields(authHeader) |
| 341 | if len(authHeaderParts) != 2 || strings.ToLower(authHeaderParts[0]) != "bearer" { |
| 342 | return "", errs.Errorf("authorization header format must be Bearer {token}") |
| 343 | } |
| 344 | return authHeaderParts[1], nil |
| 345 | } |
| 346 | |
| 347 | // Check HTTP cookies |
| 348 | var accessToken string |
| 349 | for _, cookieHeader := range headers.Values("cookie") { |
| 350 | header := http.Header{} |
| 351 | header.Add("Cookie", cookieHeader) |
| 352 | request := http.Request{Header: header} |
| 353 | if cookie, _ := request.Cookie(AccessTokenCookieName); cookie != nil { |
| 354 | accessToken = cookie.Value |
| 355 | break |
| 356 | } |
| 357 | } |
| 358 | return accessToken, nil |
| 359 | } |
| 360 | |
| 361 | func audienceContains(audience jwt.ClaimStrings, token string) bool { |
| 362 | return slices.Contains(audience, token) |
no test coverage detected