def get_user(self, **kwargs): """Gets the user data corresponding to the provided key.""" if 'uid' in kwargs: key, key_type = kwargs.pop('uid'), 'user ID' payload = {'localId' : [_auth_utils.validate_uid(key, required=True)]} elif 'email' in kwargs: key, key_type = kwargs.pop('email'), 'email' payload = {'email' : [_auth_utils.validate_email(key, required=True)]} elif 'phone_number' in kwargs: key, key_type = kwargs.pop('phone_number'), 'phone number' payload = {'phoneNumber' : [_auth_utils.validate_phone(key, required=True)]} else: raise TypeError('Unsupported keyword arguments: {0}.'.format(kwargs)) try: response = self._client.request('post', 'getAccountInfo', json=payload) except requests.exceptions.RequestException as error: msg = 'Failed to get user by {0}: {1}.'.format(key_type, key) self._handle_http_error(INTERNAL_ERROR, msg, error) else: if not response or not response.get('users'): raise ApiCallError( USER_NOT_FOUND_ERROR, 'No user record found for the provided {0}: {1}.'.format(key_type, key)) return response['users'][0]
def get_user(self, **kwargs): """Gets the user data corresponding to the provided key.""" if 'uid' in kwargs: key, key_type = kwargs.pop('uid'), 'user ID' payload = { 'localId': [_auth_utils.validate_uid(key, required=True)] } elif 'email' in kwargs: key, key_type = kwargs.pop('email'), 'email' payload = { 'email': [_auth_utils.validate_email(key, required=True)] } elif 'phone_number' in kwargs: key, key_type = kwargs.pop('phone_number'), 'phone number' payload = { 'phoneNumber': [_auth_utils.validate_phone(key, required=True)] } else: raise TypeError( 'Unsupported keyword arguments: {0}.'.format(kwargs)) try: body, http_resp = self._client.body_and_response( 'post', '/accounts:lookup', json=payload) except requests.exceptions.RequestException as error: raise _auth_utils.handle_auth_backend_error(error) else: if not body or not body.get('users'): raise _auth_utils.UserNotFoundError( 'No user record found for the provided {0}: {1}.'.format( key_type, key), http_response=http_resp) return body['users'][0]
def __init__(self, email): """Constructs a new `EmailIdentifier` object. Args: email: A user email address string. """ self._email = _auth_utils.validate_email(email, required=True)
def generate_email_action_link(self, action_type, email, action_code_settings=None): """Fetches the email action links for types Args: action_type: String. Valid values ['VERIFY_EMAIL', 'EMAIL_SIGNIN', 'PASSWORD_RESET'] email: Email of the user for which the action is performed action_code_settings: ``ActionCodeSettings`` object or dict (optional). Defines whether the link is to be handled by a mobile app and the additional state information to be passed in the deep link, etc. Returns: link_url: action url to be emailed to the user Raises: UnexpectedResponseError: If the backend server responds with an unexpected message FirebaseError: If an error occurs while generating the link ValueError: If the provided arguments are invalid """ payload = { 'requestType': _auth_utils.validate_action_type(action_type), 'email': _auth_utils.validate_email(email), 'returnOobLink': True } if action_code_settings: payload.update(encode_action_code_settings(action_code_settings)) body, http_resp = self._make_request('post', '/accounts:sendOobCode', json=payload) if not body or not body.get('oobLink'): raise _auth_utils.UnexpectedResponseError( 'Failed to generate email action link.', http_response=http_resp) return body.get('oobLink')
def create_user(self, uid=None, display_name=None, email=None, phone_number=None, photo_url=None, password=None, disabled=None, email_verified=None): """Creates a new user account with the specified properties.""" payload = { 'localId': _auth_utils.validate_uid(uid), 'displayName': _auth_utils.validate_display_name(display_name), 'email': _auth_utils.validate_email(email), 'phoneNumber': _auth_utils.validate_phone(phone_number), 'photoUrl': _auth_utils.validate_photo_url(photo_url), 'password': _auth_utils.validate_password(password), 'emailVerified': bool(email_verified) if email_verified is not None else None, 'disabled': bool(disabled) if disabled is not None else None, } payload = {k: v for k, v in payload.items() if v is not None} body, http_resp = self._make_request('post', '/accounts', json=payload) if not body or not body.get('localId'): raise _auth_utils.UnexpectedResponseError( 'Failed to create new user.', http_response=http_resp) return body.get('localId')
def send_email_action_link(self, action_type, email, action_code_settings=None): """Sends an email of the given action type Args: action_type: String. Valid values ['VERIFY_EMAIL', 'EMAIL_SIGNIN', 'PASSWORD_RESET'] email: Email of the user to whom the email will be sent action_code_settings: ``ActionCodeSettings`` object or dict (optional). Defines whether the link is to be handled by a mobile app and the additional state information to be passed in the deep link, etc. Raises: FirebaseError: If an error occurs while generating the link ValueError: If the provided arguments are invalid """ payload = { 'requestType': _auth_utils.validate_action_type(action_type), 'email': _auth_utils.validate_email(email) } if action_code_settings: payload.update(encode_action_code_settings(action_code_settings)) try: self._client.body_and_response( 'post', '/accounts:sendOobCode', json=payload) except requests.exceptions.RequestException as error: raise _auth_utils.handle_auth_backend_error(error)
def generate_email_action_link(self, action_type, email, action_code_settings=None): """Fetches the email action links for types Args: action_type: String. Valid values ['VERIFY_EMAIL', 'EMAIL_SIGNIN', 'PASSWORD_RESET'] email: Email of the user for which the action is performed action_code_settings: ``ActionCodeSettings`` object or dict (optional). Defines whether the link is to be handled by a mobile app and the additional state information to be passed in the deep link, etc. Returns: link_url: action url to be emailed to the user Raises: ApiCallError: If an error occurs while generating the link ValueError: If the provided arguments are invalid """ payload = { 'requestType': _auth_utils.validate_action_type(action_type), 'email': _auth_utils.validate_email(email), 'returnOobLink': True } if action_code_settings: payload.update(encode_action_code_settings(action_code_settings)) try: response = self._client.body('post', '/accounts:sendOobCode', json=payload) except requests.exceptions.RequestException as error: self._handle_http_error(GENERATE_EMAIL_ACTION_LINK_ERROR, 'Failed to generate link.', error) else: if not response or not response.get('oobLink'): raise ApiCallError(GENERATE_EMAIL_ACTION_LINK_ERROR, 'Failed to generate link.') return response.get('oobLink')
def update_user(self, uid, display_name=None, email=None, phone_number=None, photo_url=None, password=None, disabled=None, email_verified=None, valid_since=None, custom_claims=None): """Updates an existing user account with the specified properties""" payload = { 'localId': _auth_utils.validate_uid(uid, required=True), 'email': _auth_utils.validate_email(email), 'password': _auth_utils.validate_password(password), 'validSince': _auth_utils.validate_timestamp(valid_since, 'valid_since'), 'emailVerified': bool(email_verified) if email_verified is not None else None, 'disableUser': bool(disabled) if disabled is not None else None, } remove = [] if display_name is not None: if display_name is DELETE_ATTRIBUTE: remove.append('DISPLAY_NAME') else: payload['displayName'] = _auth_utils.validate_display_name(display_name) if photo_url is not None: if photo_url is DELETE_ATTRIBUTE: remove.append('PHOTO_URL') else: payload['photoUrl'] = _auth_utils.validate_photo_url(photo_url) if remove: payload['deleteAttribute'] = remove if phone_number is not None: if phone_number is DELETE_ATTRIBUTE: payload['deleteProvider'] = ['phone'] else: payload['phoneNumber'] = _auth_utils.validate_phone(phone_number) if custom_claims is not None: if custom_claims is DELETE_ATTRIBUTE: custom_claims = {} json_claims = json.dumps(custom_claims) if isinstance( custom_claims, dict) else custom_claims payload['customAttributes'] = _auth_utils.validate_custom_claims(json_claims) payload = {k: v for k, v in payload.items() if v is not None} try: body, http_resp = self._client.body_and_response( 'post', '/accounts:update', json=payload) except requests.exceptions.RequestException as error: raise _auth_utils.handle_auth_backend_error(error) else: if not body or not body.get('localId'): raise _auth_utils.UnexpectedResponseError( 'Failed to update user: {0}.'.format(uid), http_response=http_resp) return body.get('localId')
def update_user(self, uid, display_name=_UNSPECIFIED, email=None, phone_number=_UNSPECIFIED, photo_url=_UNSPECIFIED, password=None, disabled=None, email_verified=None, valid_since=None, custom_claims=_UNSPECIFIED): """Updates an existing user account with the specified properties""" payload = { 'localId': _auth_utils.validate_uid(uid, required=True), 'email': _auth_utils.validate_email(email), 'password': _auth_utils.validate_password(password), 'validSince': _auth_utils.validate_timestamp(valid_since, 'valid_since'), 'emailVerified': bool(email_verified) if email_verified is not None else None, 'disableUser': bool(disabled) if disabled is not None else None, } remove = [] if display_name is not _UNSPECIFIED: if display_name is None: remove.append('DISPLAY_NAME') else: payload['displayName'] = _auth_utils.validate_display_name(display_name) if photo_url is not _UNSPECIFIED: if photo_url is None: remove.append('PHOTO_URL') else: payload['photoUrl'] = _auth_utils.validate_photo_url(photo_url) if remove: payload['deleteAttribute'] = remove if phone_number is not _UNSPECIFIED: if phone_number is None: payload['deleteProvider'] = ['phone'] else: payload['phoneNumber'] = _auth_utils.validate_phone(phone_number) if custom_claims is not _UNSPECIFIED: if custom_claims is None: custom_claims = {} json_claims = json.dumps(custom_claims) if isinstance( custom_claims, dict) else custom_claims payload['customAttributes'] = _auth_utils.validate_custom_claims(json_claims) payload = {k: v for k, v in payload.items() if v is not None} try: response = self._client.request('post', 'setAccountInfo', json=payload) except requests.exceptions.RequestException as error: self._handle_http_error( USER_UPDATE_ERROR, 'Failed to update user: {0}.'.format(uid), error) else: if not response or not response.get('localId'): raise ApiCallError(USER_UPDATE_ERROR, 'Failed to update user: {0}.'.format(uid)) return response.get('localId')
def create_user(self, uid=None, display_name=None, email=None, phone_number=None, photo_url=None, password=None, disabled=None, email_verified=None): """Creates a new user account with the specified properties.""" payload = { 'localId': _auth_utils.validate_uid(uid), 'displayName': _auth_utils.validate_display_name(display_name), 'email': _auth_utils.validate_email(email), 'phoneNumber': _auth_utils.validate_phone(phone_number), 'photoUrl': _auth_utils.validate_photo_url(photo_url), 'password': _auth_utils.validate_password(password), 'emailVerified': bool(email_verified) if email_verified is not None else None, 'disabled': bool(disabled) if disabled is not None else None, } payload = {k: v for k, v in payload.items() if v is not None} try: response = self._client.request('post', 'signupNewUser', json=payload) except requests.exceptions.RequestException as error: self._handle_http_error(USER_CREATE_ERROR, 'Failed to create new user.', error) else: if not response or not response.get('localId'): raise ApiCallError(USER_CREATE_ERROR, 'Failed to create new user.') return response.get('localId')
def email(self, email): self._email = _auth_utils.validate_email(email)