-
Notifications
You must be signed in to change notification settings - Fork 1
/
twilio_capability.go
70 lines (57 loc) · 1.6 KB
/
twilio_capability.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package twilio
import (
"fmt"
"jwt"
"net/url"
"time"
)
type TwilioCapability struct {
accountSid string
authToken string
clientName string
scope []ScopeUri
}
func NewTwilioCapability(sid string, tok string) *TwilioCapability {
tc := TwilioCapability{sid, tok, "", make([]ScopeUri, 0)}
return &tc
}
func (tc *TwilioCapability) AllowClientOutgoing(applicationSid string,
appParams url.Values) {
//TODO: serialization for nested appParams in ScopeUri.String()
if appParams != nil {
panic("TwilioCapability.AllowClientOutgoing appParams not implemented.")
}
options := url.Values{
"appSid": []string{applicationSid},
}
tc.scope = append(tc.scope, ScopeUri{"client", "outgoing", options})
}
func (tc *TwilioCapability) AllowClientIncoming(clientName string) {
tc.clientName = clientName
tc.scope = append(tc.scope, ScopeUri{"client", "incoming", url.Values{}})
}
func (tc *TwilioCapability) SerializeScope() (scopeString string) {
for i, su := range tc.scope {
if tc.clientName != "" {
su.SetOption("clientName", tc.clientName)
}
scopeString += su.String()
if i+1 < len(tc.scope) {
scopeString += " "
}
}
return scopeString
}
func (tc *TwilioCapability) Generate(ttl time.Duration) (twilioToken string,
err error) {
payload := map[string]interface{}{
"iss": tc.accountSid,
"exp": time.Now().Add(ttl).Unix(),
"scope": tc.SerializeScope(),
}
token, err := jwt.Encode(payload, []byte(tc.authToken), "HS256")
if err != nil {
return "", fmt.Errorf("Problem encoding TwilioCapability.")
}
return string(token), nil
}