|  | package jwt | 
|  |  | 
|  | func verifyPrincipals(pcpls, auds []string) bool { | 
|  | // "Each principal intended to process the JWT MUST | 
|  | // identify itself with a value in the audience claim." | 
|  | // - https://tools.ietf.org/html/rfc7519#section-4.1.3 | 
|  |  | 
|  | found := -1 | 
|  | for i, p := range pcpls { | 
|  | for _, v := range auds { | 
|  | if p == v { | 
|  | found++ | 
|  | break | 
|  | } | 
|  | } | 
|  | if found != i { | 
|  | return false | 
|  | } | 
|  | } | 
|  | return true | 
|  | } | 
|  |  | 
|  | // ValidAudience returns true iff: | 
|  | // 	- a and b are strings and a == b | 
|  | // 	- a is string, b is []string and a is in b | 
|  | // 	- a is []string, b is []string and all of a is in b | 
|  | // 	- a is []string, b is string and len(a) == 1 and a[0] == b | 
|  | func ValidAudience(a, b interface{}) bool { | 
|  | s1, ok := a.(string) | 
|  | if ok { | 
|  | if s2, ok := b.(string); ok { | 
|  | return s1 == s2 | 
|  | } | 
|  | a2, ok := b.([]string) | 
|  | return ok && verifyPrincipals([]string{s1}, a2) | 
|  | } | 
|  |  | 
|  | a1, ok := a.([]string) | 
|  | if !ok { | 
|  | return false | 
|  | } | 
|  | if a2, ok := b.([]string); ok { | 
|  | return verifyPrincipals(a1, a2) | 
|  | } | 
|  | s2, ok := b.(string) | 
|  | return ok && len(a1) == 1 && a1[0] == s2 | 
|  | } |