// addClaimsFromScope adds claims that are based on the scopes that the client requested. // Currently, these include cross-client claims (aud, azp). func (s *Server) addClaimsFromScope(claims jose.Claims, scopes scope.Scopes, clientID string) error { crossClientIDs := scopes.CrossClientIDs() if len(crossClientIDs) > 0 { var aud []string for _, id := range crossClientIDs { if clientID == id { aud = append(aud, id) continue } allowed, err := s.CrossClientAuthAllowed(clientID, id) if err != nil { log.Errorf("Failed to check cross client auth. reqClientID %v; authClient:ID %v; err: %v", clientID, id, err) return oauth2.NewError(oauth2.ErrorServerError) } if !allowed { err := oauth2.NewError(oauth2.ErrorInvalidRequest) err.Description = fmt.Sprintf( "%q is not authorized to perform cross-client requests for %q", clientID, id) return err } aud = append(aud, id) } if len(aud) == 1 { claims.Add("aud", aud[0]) } else { claims.Add("aud", aud) } claims.Add("azp", clientID) } return nil }
// Generate creates a Capabilities Token given some configuration values. // See https://www.twilio.com/docs/api/client/capability-tokens for details. func Generate(c Capabilities, expires time.Duration) (string, error) { signer := jose.NewSignerHMAC("", []byte(c.AuthToken)) claims := jose.Claims{} claims.Add("iss", c.AccountSid) claims.Add("exp", Clock.Now().Add(expires).Unix()) scopes := []string{} if c.AllowClientOutgoing != "" { scope := fmt.Sprintf("scope:client:outgoing?appSid=%s", c.AllowClientOutgoing) if c.AllowClientIncoming != "" { scope += fmt.Sprintf("&clientName=%s", c.AllowClientIncoming) } scopes = append(scopes, scope) } if c.AllowClientIncoming != "" { scopes = append(scopes, fmt.Sprintf("scope:client:incoming?clientName=%s", c.AllowClientIncoming)) } claims.Add("scope", strings.Join(scopes, " ")) jwt, err := jose.NewSignedJWT(claims, signer) if err != nil { return "", err } return jwt.Encode(), nil }
// AddToClaims adds basic information about the user to the given Claims. // http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims func (u *User) AddToClaims(claims jose.Claims) { claims.Add("name", u.DisplayName) if u.Email != "" { claims.Add("email", u.Email) if u.EmailVerified { claims.Add("email_verified", true) } } }