В простейшем случае делают так:
Одна функция (регистрации) вызывает другую (получения кода) а другая функция возвращается полученный код по return.
def get_code():
code = input('code, please:')
return code
def authorise():
reg_code = get_code()
print(f'received code: {reg_code}')
authorise()
Заметки на поляхВ вашем случае в коде вижу и FSM, и хранение каких-то данных в уникальных JSON, и всякое… тут по-хорошему вы, как автор кода, представляющий структуру и отношения между объектами, должен спроектировать свою программу и если не получается, приносить сюда уже конкретную проблему, что не получается при реализации, а не вот это.
Кроме того, вопрос популярный, и вы сначала обязаны поискать самостоятельно.
Как бы я сделал, зная то, что видно из фрагментов кода?
Первое, что приходит в голову, это хранение в JSONраз у нас есть уникальные JSON, относящиеся каждый к своему аккаунту, почему бы не сделать там соотвествующий ключ и через него не передавать относящееся к соответствующему аккаунту значение? Изначально пусть None, периодически проверять его значение, по получении ключа пишем туда значение, если не None - завершаем регистрацию, используя это значение, после использования опять выставить None.
Но это так… первое, что пришло в голову. Тут есть много нюансов. Во-первых, возможно блокирование JSON-файлов и асинхронная гонка, соответственно надо сочинять какую-нибудь синхронизацию (а тут можно начудить так, что потом не распутать); во-вторых, не все хостинги поддерживают хранение созданных файлов; в-третьих, для этого придуманы Redis, in-memory SQLite и т.п.
Есть варианты с глобальной переменной-словарем, есть с БД, наверное есть и с FSM (я ее вообще не знаю, поэтому не могу советовать, но раз там есть метод set, то надо смотреть внимательно, может уже там всё предусмотрено).