Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support additional login ids #334

Merged
merged 4 commits into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 20 additions & 18 deletions descope/internal/mgmt/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ func (u *user) Create(loginID string, user *descope.UserRequest) (*descope.UserR
if user == nil {
user = &descope.UserRequest{}
}
return u.create(loginID, user.Email, user.Phone, user.Name, user.Picture, user.Roles, user.Tenants, false, false, user.CustomAttributes, user.VerifiedEmail, user.VerifiedPhone, nil)
return u.create(loginID, user.Email, user.Phone, user.Name, user.Picture, user.Roles, user.Tenants, false, false, user.CustomAttributes, user.VerifiedEmail, user.VerifiedPhone, user.AdditionalLoginIDs, nil)
}

func (u *user) CreateTestUser(loginID string, user *descope.UserRequest) (*descope.UserResponse, error) {
if user == nil {
user = &descope.UserRequest{}
}
return u.create(loginID, user.Email, user.Phone, user.Name, user.Picture, user.Roles, user.Tenants, false, true, user.CustomAttributes, user.VerifiedEmail, user.VerifiedPhone, nil)
return u.create(loginID, user.Email, user.Phone, user.Name, user.Picture, user.Roles, user.Tenants, false, true, user.CustomAttributes, user.VerifiedEmail, user.VerifiedPhone, user.AdditionalLoginIDs, nil)
}

func (u *user) CreateBatch(users []*descope.BatchUser) (*descope.UsersBatchResponse, error) {
Expand All @@ -37,7 +37,7 @@ func (u *user) Invite(loginID string, user *descope.UserRequest, options *descop
if user == nil {
user = &descope.UserRequest{}
}
return u.create(loginID, user.Email, user.Phone, user.Name, user.Picture, user.Roles, user.Tenants, true, false, user.CustomAttributes, user.VerifiedEmail, user.VerifiedPhone, options)
return u.create(loginID, user.Email, user.Phone, user.Name, user.Picture, user.Roles, user.Tenants, true, false, user.CustomAttributes, user.VerifiedEmail, user.VerifiedPhone, user.AdditionalLoginIDs, options)
}

func (u *user) InviteBatch(users []*descope.BatchUser, options *descope.InviteOptions) (*descope.UsersBatchResponse, error) {
Expand All @@ -47,11 +47,11 @@ func (u *user) InviteBatch(users []*descope.BatchUser, options *descope.InviteOp
return u.createBatch(users, options)
}

func (u *user) create(loginID, email, phone, displayName, picture string, roles []string, tenants []*descope.AssociatedTenant, invite, test bool, customAttributes map[string]any, verifiedEmail *bool, verifiedPhone *bool, options *descope.InviteOptions) (*descope.UserResponse, error) {
func (u *user) create(loginID, email, phone, displayName, picture string, roles []string, tenants []*descope.AssociatedTenant, invite, test bool, customAttributes map[string]any, verifiedEmail *bool, verifiedPhone *bool, additionalLoginIDs []string, options *descope.InviteOptions) (*descope.UserResponse, error) {
if loginID == "" {
return nil, utils.NewInvalidArgumentError("loginID")
}
req := makeCreateUserRequest(loginID, email, phone, displayName, picture, roles, tenants, invite, test, customAttributes, verifiedEmail, verifiedPhone, options)
req := makeCreateUserRequest(loginID, email, phone, displayName, picture, roles, tenants, invite, test, customAttributes, verifiedEmail, verifiedPhone, additionalLoginIDs, options)
res, err := u.client.DoPostRequest(api.Routes.ManagementUserCreate(), req, nil, u.conf.ManagementKey)
if err != nil {
return nil, err
Expand All @@ -75,7 +75,7 @@ func (u *user) Update(loginID string, user *descope.UserRequest) (*descope.UserR
if user == nil {
user = &descope.UserRequest{}
}
req := makeUpdateUserRequest(loginID, user.Email, user.Phone, user.Name, user.Picture, user.Roles, user.Tenants, user.CustomAttributes, user.VerifiedEmail, user.VerifiedPhone)
req := makeUpdateUserRequest(loginID, user.Email, user.Phone, user.Name, user.Picture, user.Roles, user.Tenants, user.CustomAttributes, user.VerifiedEmail, user.VerifiedPhone, user.AdditionalLoginIDs)
res, err := u.client.DoPostRequest(api.Routes.ManagementUserUpdate(), req, nil, u.conf.ManagementKey)
if err != nil {
return nil, err
Expand Down Expand Up @@ -455,9 +455,10 @@ func (u *user) GenerateEmbeddedLink(loginID string, customClaims map[string]any)
return tRes.Token, nil
}

func makeCreateUserRequest(loginID, email, phone, displayName, picture string, roles []string, tenants []*descope.AssociatedTenant, invite, test bool, customAttributes map[string]any, verifiedEmail *bool, verifiedPhone *bool, options *descope.InviteOptions) map[string]any {
req := makeUpdateUserRequest(loginID, email, phone, displayName, picture, roles, tenants, customAttributes, verifiedEmail, verifiedPhone)
func makeCreateUserRequest(loginID, email, phone, displayName, picture string, roles []string, tenants []*descope.AssociatedTenant, invite, test bool, customAttributes map[string]any, verifiedEmail *bool, verifiedPhone *bool, additionalLoginIDs []string, options *descope.InviteOptions) map[string]any {
req := makeUpdateUserRequest(loginID, email, phone, displayName, picture, roles, tenants, customAttributes, verifiedEmail, verifiedPhone, additionalLoginIDs)
req["invite"] = invite
req["additionalLoginIds"] = additionalLoginIDs
if test {
req["test"] = true
}
Expand All @@ -478,7 +479,7 @@ func makeCreateUserRequest(loginID, email, phone, displayName, picture string, r
func makeCreateUsersBatchRequest(users []*descope.BatchUser, options *descope.InviteOptions) map[string]any {
var usersReq []map[string]any
for _, u := range users {
user := makeUpdateUserRequest(u.LoginID, u.Email, u.Phone, u.Name, u.Picture, u.Roles, u.Tenants, u.CustomAttributes, u.VerifiedEmail, u.VerifiedPhone)
user := makeUpdateUserRequest(u.LoginID, u.Email, u.Phone, u.Name, u.Picture, u.Roles, u.Tenants, u.CustomAttributes, u.VerifiedEmail, u.VerifiedPhone, u.AdditionalLoginIDs)
if u.Password != nil {
if cleartext := u.Password.Cleartext; cleartext != "" {
user["password"] = u.Password.Cleartext
Expand Down Expand Up @@ -518,16 +519,17 @@ func makeCreateUsersBatchRequest(users []*descope.BatchUser, options *descope.In
return req
}

func makeUpdateUserRequest(loginID, email, phone, displayName, picture string, roles []string, tenants []*descope.AssociatedTenant, customAttributes map[string]any, verifiedEmail *bool, verifiedPhone *bool) map[string]any {
func makeUpdateUserRequest(loginID, email, phone, displayName, picture string, roles []string, tenants []*descope.AssociatedTenant, customAttributes map[string]any, verifiedEmail *bool, verifiedPhone *bool, additionalLoginIDs []string) map[string]any {
res := map[string]any{
"loginId": loginID,
"email": email,
"phone": phone,
"displayName": displayName,
"roleNames": roles,
"userTenants": makeAssociatedTenantList(tenants),
"customAttributes": customAttributes,
"picture": picture,
"loginId": loginID,
"email": email,
"phone": phone,
"displayName": displayName,
"roleNames": roles,
"userTenants": makeAssociatedTenantList(tenants),
"customAttributes": customAttributes,
"picture": picture,
"additionalLoginIds": additionalLoginIDs,
}
if verifiedEmail != nil {
res["verifiedEmail"] = *verifiedEmail
Expand Down
15 changes: 8 additions & 7 deletions descope/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -273,13 +273,14 @@ type User struct {
}

type UserRequest struct {
User `json:",inline"`
Roles []string `json:"roles,omitempty"`
Tenants []*AssociatedTenant `json:"tenants,omitempty"`
CustomAttributes map[string]any `json:"customAttributes,omitempty"`
Picture string `json:"picture,omitempty"`
VerifiedEmail *bool `json:"verifiedEmail,omitempty"`
VerifiedPhone *bool `json:"verifiedPhone,omitempty"`
User `json:",inline"`
Roles []string `json:"roles,omitempty"`
Tenants []*AssociatedTenant `json:"tenants,omitempty"`
CustomAttributes map[string]any `json:"customAttributes,omitempty"`
Picture string `json:"picture,omitempty"`
VerifiedEmail *bool `json:"verifiedEmail,omitempty"`
VerifiedPhone *bool `json:"verifiedPhone,omitempty"`
AdditionalLoginIDs []string `json:"additionalLoginIds,omitempty"`
}

type BatchUser struct {
Expand Down