12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package request
- import (
- "net/http"
- "github.com/golang-jwt/jwt/v4"
- )
- // ParseFromRequest extracts and parses a JWT token from an HTTP request.
- // This behaves the same as Parse, but accepts a request and an extractor
- // instead of a token string. The Extractor interface allows you to define
- // the logic for extracting a token. Several useful implementations are provided.
- //
- // You can provide options to modify parsing behavior
- func ParseFromRequest(req *http.Request, extractor Extractor, keyFunc jwt.Keyfunc, options ...ParseFromRequestOption) (token *jwt.Token, err error) {
- // Create basic parser struct
- p := &fromRequestParser{req, extractor, nil, nil}
- // Handle options
- for _, option := range options {
- option(p)
- }
- // Set defaults
- if p.claims == nil {
- p.claims = jwt.MapClaims{}
- }
- if p.parser == nil {
- p.parser = &jwt.Parser{}
- }
- // perform extract
- tokenString, err := p.extractor.ExtractToken(req)
- if err != nil {
- return nil, err
- }
- // perform parse
- return p.parser.ParseWithClaims(tokenString, p.claims, keyFunc)
- }
- // ParseFromRequestWithClaims is an alias for ParseFromRequest but with custom Claims type.
- //
- // Deprecated: use ParseFromRequest and the WithClaims option
- func ParseFromRequestWithClaims(req *http.Request, extractor Extractor, claims jwt.Claims, keyFunc jwt.Keyfunc) (token *jwt.Token, err error) {
- return ParseFromRequest(req, extractor, keyFunc, WithClaims(claims))
- }
- type fromRequestParser struct {
- req *http.Request
- extractor Extractor
- claims jwt.Claims
- parser *jwt.Parser
- }
- type ParseFromRequestOption func(*fromRequestParser)
- // WithClaims parses with custom claims
- func WithClaims(claims jwt.Claims) ParseFromRequestOption {
- return func(p *fromRequestParser) {
- p.claims = claims
- }
- }
- // WithParser parses using a custom parser
- func WithParser(parser *jwt.Parser) ParseFromRequestOption {
- return func(p *fromRequestParser) {
- p.parser = parser
- }
- }
|