Java tutorial
/* * Copyright 2017 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.firebase.auth; import com.google.api.client.json.JsonFactory; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.io.BaseEncoding; import com.google.firebase.internal.NonNull; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Represents a user account to be imported to Firebase Auth via the * {@link FirebaseAuth#importUsers(List, UserImportOptions)} API. Must contain at least a * uid string. */ public final class ImportUserRecord { private final Map<String, Object> properties; private ImportUserRecord(Map<String, Object> properties) { this.properties = ImmutableMap.copyOf(properties); } Map<String, Object> getProperties(JsonFactory jsonFactory) { Map<String, Object> copy = new HashMap<>(properties); // serialize custom claims if (copy.containsKey(UserRecord.CUSTOM_ATTRIBUTES)) { Map customClaims = (Map) copy.remove(UserRecord.CUSTOM_ATTRIBUTES); copy.put(UserRecord.CUSTOM_ATTRIBUTES, UserRecord.serializeCustomClaims(customClaims, jsonFactory)); } return ImmutableMap.copyOf(copy); } boolean hasPassword() { return this.properties.containsKey("passwordHash"); } /** * Creates a new {@link ImportUserRecord.Builder}. * * @return A {@link ImportUserRecord.Builder} instance. */ public static Builder builder() { return new Builder(); } public static class Builder { private String uid; private String email; private Boolean emailVerified; private String displayName; private String phoneNumber; private String photoUrl; private Boolean disabled; private UserMetadata userMetadata; private byte[] passwordHash; private byte[] passwordSalt; private final List<UserProvider> userProviders = new ArrayList<>(); private final Map<String, Object> customClaims = new HashMap<>(); private Builder() { } /** * Sets a user ID for the user. * * @param uid a non-null, non-empty user ID that uniquely identifies the user. The user ID * must not be longer than 128 characters. * @return This builder. */ public Builder setUid(String uid) { this.uid = uid; return this; } /** * Sets an email address for the user. * * @param email a non-null, non-empty email address string. * @return This builder. */ public Builder setEmail(String email) { this.email = email; return this; } /** * Sets whether the user email address has been verified or not. * * @param emailVerified a boolean indicating the email verification status. * @return This builder. */ public Builder setEmailVerified(boolean emailVerified) { this.emailVerified = emailVerified; return this; } /** * Sets the display name for the user. * * @param displayName a non-null, non-empty display name string. * @return This builder. */ public Builder setDisplayName(String displayName) { this.displayName = displayName; return this; } /** * Sets the phone number associated with this user. * * @param phoneNumber a valid phone number string. * @return This builder. */ public Builder setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; return this; } /** * Sets the photo URL for the user. * * @param photoUrl a non-null, non-empty URL string. * @return This builder. */ public Builder setPhotoUrl(String photoUrl) { this.photoUrl = photoUrl; return this; } /** * Sets whether the user account should be disabled by default or not. * * @param disabled a boolean indicating whether the account should be disabled. * @return This builder. */ public Builder setDisabled(boolean disabled) { this.disabled = disabled; return this; } /** * Sets additional metadata about the user. * * @param userMetadata A {@link UserMetadata} instance. * @return This builder. */ public Builder setUserMetadata(UserMetadata userMetadata) { this.userMetadata = userMetadata; return this; } /** * Sets a byte array representing the user's hashed password. If at least one user account * carries a password hash, a {@link UserImportHash} must be specified when calling the * {@link FirebaseAuth#importUsersAsync(List, UserImportOptions)} method. See * {@link UserImportOptions.Builder#setHash(UserImportHash)}. * * @param passwordHash A byte array. * @return This builder. */ public Builder setPasswordHash(byte[] passwordHash) { this.passwordHash = passwordHash; return this; } /** * Sets a byte array representing the user's password salt. * * @param passwordSalt A byte array. * @return This builder. */ public Builder setPasswordSalt(byte[] passwordSalt) { this.passwordSalt = passwordSalt; return this; } /** * Adds a user provider to be associated with this user. * * <p>A {@link UserProvider} represents the identity of the user as specified by an * identity provider that is linked to this user account. The identity provider can specify * its own values for common user attributes like email, display name and photo URL. * * @param provider A non-null {@link UserProvider}. * @return This builder. */ public Builder addUserProvider(@NonNull UserProvider provider) { this.userProviders.add(provider); return this; } /** * Associates all user provider's in the given list with this user. * * @param providers A list of {@link UserProvider} instances. * @return This builder. */ public Builder addAllUserProviders(List<UserProvider> providers) { this.userProviders.addAll(providers); return this; } /** * Sets the specified custom claim on this user account. * * @param key Name of the claim. * @param value Value of the claim. * @return This builder. */ public Builder putCustomClaim(String key, Object value) { this.customClaims.put(key, value); return this; } /** * Sets the custom claims associated with this user. * * @param customClaims a Map of custom claims */ public Builder putAllCustomClaims(Map<String, Object> customClaims) { this.customClaims.putAll(customClaims); return this; } /** * Builds a new {@link ImportUserRecord}. * * @return A non-null {@link ImportUserRecord}. */ public ImportUserRecord build() { Map<String, Object> properties = new HashMap<>(); UserRecord.checkUid(uid); properties.put("localId", uid); if (!Strings.isNullOrEmpty(email)) { UserRecord.checkEmail(email); properties.put("email", email); } if (!Strings.isNullOrEmpty(photoUrl)) { UserRecord.checkUrl(photoUrl); properties.put("photoUrl", photoUrl); } if (!Strings.isNullOrEmpty(phoneNumber)) { UserRecord.checkPhoneNumber(phoneNumber); properties.put("phoneNumber", phoneNumber); } if (!Strings.isNullOrEmpty(displayName)) { properties.put("displayName", displayName); } if (userMetadata != null) { if (userMetadata.getCreationTimestamp() > 0) { properties.put("createdAt", userMetadata.getCreationTimestamp()); } if (userMetadata.getLastSignInTimestamp() > 0) { properties.put("lastLoginAt", userMetadata.getLastSignInTimestamp()); } } if (passwordHash != null) { properties.put("passwordHash", BaseEncoding.base64Url().encode(passwordHash)); } if (passwordSalt != null) { properties.put("salt", BaseEncoding.base64Url().encode(passwordSalt)); } if (userProviders.size() > 0) { properties.put("providerUserInfo", ImmutableList.copyOf(userProviders)); } if (customClaims.size() > 0) { ImmutableMap<String, Object> mergedClaims = ImmutableMap.copyOf(customClaims); UserRecord.checkCustomClaims(mergedClaims); properties.put(UserRecord.CUSTOM_ATTRIBUTES, mergedClaims); } if (emailVerified != null) { properties.put("emailVerified", emailVerified); } if (disabled != null) { properties.put("disabled", disabled); } return new ImportUserRecord(properties); } } }