func (s *Service) CreateUser(user kit.User, adaptorName string, authData map[string]interface{}) apperror.Error { adaptor := s.AuthAdaptor(adaptorName) if adaptor == nil { return &apperror.Err{ Code: "unknown_auth_adaptor", Message: fmt.Sprintf("Auth adaptor %v was not registered with user service", adaptorName), Public: true, } } authItem, err := adaptor.RegisterUser(user, authData) if err != nil { return apperror.Wrap(err, "adaptor_error", "") } if user.GetUsername() == "" { user.SetUsername(user.GetEmail()) } // Check if user with same username or email exists. oldUser, err2 := s.Users.Q(). Filter("email", user.GetEmail()).Or("username", user.GetUsername()).First() if err2 != nil { return err2 } else if oldUser != nil { return &apperror.Err{ Code: "user_exists", Message: "A user with the username or email already exists", Public: true, } } user.SetIsActive(true) profile := user.GetProfile() // If a profile is configured, and the user does not have a profile yet, // create a new one. if s.Profiles != nil && profile == nil { profile = s.Profiles.CreateModel().(kit.UserProfile) user.SetProfile(profile) } if err := s.Users.Create(user, nil); err != nil { return err } // Create profile if one exists. if profile != nil { profile.SetUser(user) if err := s.Profiles.Create(profile, user); err != nil { s.Users.Backend().Delete(user) return apperror.Wrap(err, "user_profile_create_error", "Could not create the user profile") } } // Persist auth item. if authItemUserId, ok := authItem.(kit.UserModel); ok { authItemUserId.SetUserId(user.GetId()) } if err := s.Users.Backend().Create(authItem); err != nil { s.Users.Backend().Delete(user) if profile != nil { s.Profiles.Backend().Delete(profile) } return apperror.Wrap(err, "auth_item_create_error", "") } if err := s.SendConfirmationEmail(user); err != nil { s.registry.Logger().Errorf("Could not send confirmation email: %v", err) } return nil }
func (a *AuthAdaptorOauth) RegisterUser(user kit.User, data map[string]interface{}) (kit.AuthItem, apperror.Error) { serviceName, _ := GetStringFromMap(data, "service") if serviceName == "" { return nil, apperror.New("invalid_data_missing_service") } service := a.services[serviceName] if service == nil { return nil, &apperror.Err{ Code: "unconfigured_service", Message: fmt.Sprintf("The oauth service '%v' was not configured in oauth auth adaptor", serviceName), } } accessToken, _ := GetStringFromMap(data, "access_token") if accessToken == "" { return nil, apperror.New("invalid_data_missing_access_token") } // Exchange access token for long lived token. // This also verifies that the supplied token is valid. appToken, err := service.Exchange(accessToken) if err != nil { return nil, apperror.Wrap(err, "oauth_exchange_token_error", "") } userData, err := service.GetUserData(appToken) if err != nil { return nil, apperror.Wrap(err, "fetch_user_data_failed", "") } if userData.Id == "" { return nil, &apperror.Err{ Code: "fetched_userdata_missing_user_id", Message: "The userData fetched from the service does not contain a userId", } } item := &AuthItemOauth{ Service: serviceName, UserId: user.GetStrId(), ExternalUserId: userData.Id, Token: appToken, } item.Id = serviceName + "_" + userData.Id // Fill in user information. if user.GetEmail() == "" { if userData.Email != "" { user.SetEmail(userData.Email) user.SetIsEmailConfirmed(true) } else { return nil, &apperror.Err{ Code: "oauth_service_insufficient_data_error", Message: fmt.Sprintf("The oauth service %v did not supply the users email, which is required", serviceName), } } } if user.GetUsername() == "" && userData.Username != "" { user.SetUsername(userData.Username) } return item, nil }