2017-01-19 1 views
1

Я хочу сгенерировать токен и вставить его в мой mysql db, это текущий код, который передается только «123». mix phoenix.gen.secret может генерировать случайную строку, как я могу использовать ее для моего контроллера?Феникс-фрейм Генерация случайной строки с использованием контроллера

def create(conn, %{"token" => token_params}) do 
token_params = Map.merge(token_params, %{"value" => "123"}) 

changeset = Token.changeset(%Token{}, token_params) 

case Repo.insert(changeset) do 
    {:ok, token} -> 
    conn 
    |> put_status(:created) 
    |> put_resp_header("location", token_path(conn, :show, token)) 
    |> render("show.json", token: token) 
    {:error, changeset} -> 
    conn 
    |> put_status(:unprocessable_entity) 
    |> render(MyApp.ChangesetView, "error.json", changeset: changeset) 
    end 

конец

ответ

7

Вы можете использовать :crypto.strong_rand_bytes/1, который mix phoenix.gen.secretuses internally:

iex(1)> length = 32 
32 
iex(3)> :crypto.strong_rand_bytes(length) |> Base.encode64 |> binary_part(0, length) 
"YiX2oINVqVWCCQZdmESBN44OxcErAFR4" 
iex(4)> :crypto.strong_rand_bytes(length) |> Base.encode64 |> binary_part(0, length) 
"ka2PSR9cHYSlD6fhdMpnGHgTVA7AoDwN" 
+0

я добавил 'defp random_string (длина)' в мой контроллер, как я могу назвать random_string в моей Map.Merge? – Joseph

+0

itried 'token_params = Map.merge (token_params,% {значение: Token.random_string (32)})' и возвращает ошибку 'функция MyApp.Token.random_string/1 не определена или закрыта ' – Joseph

+0

@JAlcantara 'Map.merge (token_params,% {"value" => random_string (32)}) '? Более целесообразно использовать здесь «Map.put»: «Map.put (token_params,« value », random_string (32))». – Dogbert

1

Phoenix имеет встроенный Phoenix.Token модуль для создания токена, который позволит вам проверить подлинность токен, даже не попав в базу данных. Например, если вы хотите создать маркер для конкретного пользователя:

# Generate a token for a given user_id 
user_id = # get id of current user 
token = Phoenix.Token.sign(MyApp.Endpoint, "user", user_id) 

# Later, verify and decode the token, 
# and assert that it matches the expected user_id 
user_id = # get id of current user 
{:ok, ^user_id} = Phoenix.Token.verify(MyApp.Endpoint, "user", token) 
+0

Спасибо. Я попробую этот подход, и я хочу вставить сгенерированный токен в мою базу данных, возможно ли это в этом подходе? – Joseph

+0

Да, вы можете дополнительно вставить токен в базу данных, но в зависимости от вашего конкретного варианта использования это может и не понадобиться. Вам нужно хранить токены в БД, например, чтобы отменить их. –

Смежные вопросы