Skip to content

Commit

Permalink
finishing test and capability token capability
Browse files Browse the repository at this point in the history
  • Loading branch information
odv-caring committed Oct 6, 2021
1 parent 2d5258d commit 6326240
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 9 deletions.
40 changes: 31 additions & 9 deletions token/capability_token.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ type cToken struct {
Version string `json:"version"`
FriendlyName string `json:"friendly_name"`
AccountSid string `json:"account_sid"`
Channel string `json:"channel"`
WorkspaceSid string `json:"workspace_sid"`
Channel string `json:"channel"`
WorkerSid string `json:"worker_sid"`
}

type Policy struct {
Expand Down Expand Up @@ -109,22 +110,42 @@ func DefaultEventBridgePolicies(accountSid, channelId string) []Policy {
}
}

func BuildWorkspacePolicy(resources []string, opts CapabilityTokenOptions) Policy {
func BuildWorkspacePolicy(opts CapabilityTokenOptions, method string, resources []string) Policy {
if method == "" {
method = "GET"
}

fullResourceArray := []string{TASKROUTER_BASE_URL, opts.Version, WORKSPACES, opts.WorkspaceSid}
fullResourceArray = append(fullResourceArray, resources...)

url := strings.Join(fullResourceArray, "/")

return Policy{
URL: url,
URL: url,
Method: method,
}
}

func (t *CapabilityToken) New(opts CapabilityTokenOptions) *CapabilityToken {
var policyMaps = make([]map[string]interface{}, len(opts.Policies))
// NewCapabilityToken generates a new CapabilityToken with the provided CapabilityTokenOptions.
//
// To see more visit: https://www.twilio.com/docs/taskrouter/js-sdk/workspace/constructing-jwts
func NewCapabilityToken(opts CapabilityTokenOptions) *CapabilityToken {
policies := opts.Policies

if opts.DefaultWorkerCapabilities {
policies = append(policies, DefaultWorkerPolicies(opts.WorkspaceSid, opts.WorkerSid, opts.Version)...)
}

if opts.DefaultEventBridgeCapabilities {
policies = append(policies, DefaultEventBridgePolicies(opts.AccountSid, opts.WorkerSid)...)
}

var policyMaps = make([]map[string]interface{}, 0)

for _, policy := range opts.Policies {
policyMaps = append(policyMaps, policy.ToMap())
for _, policy := range policies {
if policy.ToMap() != nil {
policyMaps = append(policyMaps, policy.ToMap())
}
}

return &CapabilityToken{
Expand All @@ -144,7 +165,7 @@ func (t *CapabilityToken) JWT() (string, error) {

stdClaims := &stdToken{
ExpiresAt: now.Add(t.ttl).Unix(),
Issuer: t.apiKey,
Issuer: t.accountSid,
}

t.mu.Lock()
Expand All @@ -156,8 +177,9 @@ func (t *CapabilityToken) JWT() (string, error) {
t.version,
t.workerSid,
t.accountSid,
t.workerSid,
t.workspaceSid,
t.workspaceSid,
t.workerSid,
}
// marshal header
data, err := json.Marshal(claims)
Expand Down
43 changes: 43 additions & 0 deletions token/capability_token_test.go
Original file line number Diff line number Diff line change
@@ -1 +1,44 @@
package token

import (
"testing"
"time"
)

const (
WORKSPACE_SID = "WS1234567890"
WORKER_SID = "WK1234567890"
)

func TestCapabilityJWT(t *testing.T) {
t.Parallel()

opts := CapabilityTokenOptions{
Ttl: time.Duration(1000 * time.Second),
AccountSid: ACC_SID,
ApiKey: API_KEY,
ApiSecret: API_SECRET,
WorkspaceSid: WORKSPACE_SID,
WorkerSid: WORKER_SID,
Version: "v1",
DefaultWorkerCapabilities: true,
DefaultEventBridgeCapabilities: true,
}

opts.Policies = append(opts.Policies, BuildWorkspacePolicy(opts, "", nil))
opts.Policies = append(opts.Policies, BuildWorkspacePolicy(opts, "", []string{"**"}))
opts.Policies = append(opts.Policies, BuildWorkspacePolicy(opts, "POST", []string{"Activities"}))
opts.Policies = append(opts.Policies, BuildWorkspacePolicy(opts, "POST", []string{"Workers", opts.WorkerSid, "Reservations", "**"}))

capTkn := NewCapabilityToken(opts)
jwtString, err := capTkn.JWT()
if err != nil {
t.Error("Unexpected error when generating the capability token", err)
}

t.Log(jwtString)

if jwtString == "" {
t.Error("token returned is empty")
}
}

0 comments on commit 6326240

Please sign in to comment.