def register(request): register_serializer = RegisterSerializer(data=request.data) register_serializer.is_valid(raise_exception=True) data = register_serializer.data action_code_settings = auth.ActionCodeSettings( url='https://buildevents.today/#login', ) try: user = auth.create_user(email=data['email'], phone_number=data['phone_number'], display_name=data['name'], password=data['password']) link = auth.generate_email_verification_link( user.email, action_code_settings) email_success = AuthViewSet.send_verification_email( user.email, link) if not email_success: return Response( { 'detail': 'Something went wrong, we are unable to send a verification link to your ' 'email' }, status=status.HTTP_503_SERVICE_UNAVAILABLE) else: return Response( "Verification link has been sent to {}.".format( user.email), status=status.HTTP_200_OK) except (ValueError, exceptions.FirebaseError) as e: return Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST)
def test_email_verification_with_settings(new_user_email_unverified, api_key): action_code_settings = auth.ActionCodeSettings(ACTION_LINK_CONTINUE_URL) link = auth.generate_email_verification_link(new_user_email_unverified.email, action_code_settings=action_code_settings) assert isinstance(link, str) query_dict = _extract_link_params(link) assert query_dict['continueUrl'] == ACTION_LINK_CONTINUE_URL user_email = _verify_email(query_dict['oobCode'], api_key) assert new_user_email_unverified.email == user_email assert auth.get_user(new_user_email_unverified.uid).email_verified
def test_email_sign_in_with_settings(new_user_email_unverified, api_key): action_code_settings = auth.ActionCodeSettings(ACTION_LINK_CONTINUE_URL) link = auth.generate_sign_in_with_email_link(new_user_email_unverified.email, action_code_settings=action_code_settings) assert isinstance(link, str) query_dict = _extract_link_params(link) assert query_dict['continueUrl'] == ACTION_LINK_CONTINUE_URL oob_code = query_dict['oobCode'] id_token = _sign_in_with_email_link(new_user_email_unverified.email, oob_code, api_key) assert id_token is not None and len(id_token) > 0 assert auth.get_user(new_user_email_unverified.uid).email_verified
def test_password_reset_with_settings(new_user_email_unverified, api_key): action_code_settings = auth.ActionCodeSettings(ACTION_LINK_CONTINUE_URL) link = auth.generate_password_reset_link(new_user_email_unverified.email, action_code_settings=action_code_settings) assert isinstance(link, str) query_dict = _extract_link_params(link) assert query_dict['continueUrl'] == ACTION_LINK_CONTINUE_URL user_email = _reset_password(query_dict['oobCode'], 'newPassword', api_key) assert new_user_email_unverified.email == user_email # password reset also set email_verified to True assert auth.get_user(new_user_email_unverified.uid).email_verified
def init_action_code_settings(): # [START init_action_code_settings] action_code_settings = auth.ActionCodeSettings( url='https://www.example.com/checkout?cartId=1234', handle_code_in_app=True, ios_bundle_id='com.example.ios', android_package_name='com.example.android', android_install_app=True, android_minimum_version='12', dynamic_link_domain='coolapp.page.link', ) # [END init_action_code_settings] return action_code_settings
def test_generate_sign_in_with_email_link(self, tenant_mgt_app): client = tenant_mgt.auth_for_tenant('tenant-id', app=tenant_mgt_app) recorder = _instrument_user_mgt(client, 200, '{"oobLink":"https://testlink"}') settings = auth.ActionCodeSettings(url='http://localhost') link = client.generate_sign_in_with_email_link('*****@*****.**', settings) assert link == 'https://testlink' self._assert_request( recorder, '/accounts:sendOobCode', { 'email': '*****@*****.**', 'requestType': 'EMAIL_SIGNIN', 'returnOobLink': True, 'continueUrl': 'http://localhost', })
def generate_email_verification_link_tenant(tenant_client): # [START email_verification_link_tenant] action_code_settings = auth.ActionCodeSettings( url='https://www.example.com/checkout?cartId=1234', handle_code_in_app=True, ios_bundle_id='com.example.ios', android_package_name='com.example.android', android_install_app=True, android_minimum_version='12', # FDL custom domain. dynamic_link_domain='coolapp.page.link', ) email = '*****@*****.**' link = tenant_client.generate_email_verification_link( email, action_code_settings) # Construct email from a template embedding the link, and send # using a custom SMTP server. send_custom_email(email, link)
def test_valid_data(self): data = { 'url': 'http://localhost', 'handle_code_in_app': True, 'dynamic_link_domain': 'http://testly', 'ios_bundle_id': 'test.bundle', 'android_package_name': 'test.bundle', 'android_minimum_version': '7', 'android_install_app': True, } settings = auth.ActionCodeSettings(**data) parameters = _user_mgt.encode_action_code_settings(settings) assert parameters['continueUrl'] == data['url'] assert parameters['canHandleCodeInApp'] == data['handle_code_in_app'] assert parameters['dynamicLinkDomain'] == data['dynamic_link_domain'] assert parameters['iosBundleId'] == data['ios_bundle_id'] assert parameters['androidPackageName'] == data['android_package_name'] assert parameters['androidMinimumVersion'] == data['android_minimum_version'] assert parameters['androidInstallApp'] == data['android_install_app']
import random import string import time from urllib import parse import uuid import requests import pytest from firebase_admin import auth from firebase_admin import tenant_mgt from integration import test_auth ACTION_LINK_CONTINUE_URL = 'http://localhost?a=1&b=5#f=1' ACTION_CODE_SETTINGS = auth.ActionCodeSettings(ACTION_LINK_CONTINUE_URL) VERIFY_TOKEN_URL = 'https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken' @pytest.fixture(scope='module') def sample_tenant(): tenant = tenant_mgt.create_tenant(display_name='admin-python-tenant', allow_password_sign_up=True, enable_email_link_sign_in=True) yield tenant tenant_mgt.delete_tenant(tenant.tenant_id) @pytest.fixture(scope='module') def tenant_user(sample_tenant): client = tenant_mgt.auth_for_tenant(sample_tenant.tenant_id)
def test_bad_url(self): settings = auth.ActionCodeSettings('http:') with pytest.raises(ValueError): _user_mgt.encode_action_code_settings(settings)
def test_bad_data(self, data): settings = auth.ActionCodeSettings('http://localhost', **data) with pytest.raises(ValueError): _user_mgt.encode_action_code_settings(settings)
INVALID_INTS = [None, 'foo', '1', -1, 1.1, True, False, list(), tuple(), dict()] INVALID_TIMESTAMPS = ['foo', '1', 0, -1, 1.1, True, False, list(), tuple(), dict()] MOCK_GET_USER_RESPONSE = testutils.resource('get_user.json') MOCK_LIST_USERS_RESPONSE = testutils.resource('list_users.json') MOCK_ACTION_CODE_DATA = { 'url': 'http://localhost', 'handle_code_in_app': True, 'dynamic_link_domain': 'http://testly', 'ios_bundle_id': 'test.bundle', 'android_package_name': 'test.bundle', 'android_minimum_version': '7', 'android_install_app': True, } MOCK_ACTION_CODE_SETTINGS = auth.ActionCodeSettings(**MOCK_ACTION_CODE_DATA) @pytest.fixture(scope='module') def user_mgt_app(): app = firebase_admin.initialize_app(testutils.MockCredential(), name='userMgt', options={'projectId': 'mock-project-id'}) yield app firebase_admin.delete_app(app) def _instrument_user_manager(app, status, payload): auth_service = auth._get_auth_service(app) user_manager = auth_service.user_manager recorder = [] user_manager._client.session.mount( auth._AuthService.ID_TOOLKIT_URL, testutils.MockAdapter(payload, status, recorder))