Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate a random url safe string with Elixir

I need to be able to generate random url safe strings so I could use those in links (like in an activation link sent to a user's email), so how can I generate it? Is there a way to do that only with Elixir or I'd have to use some library?

like image 694
NoDisplayName Avatar asked Aug 14 '15 02:08

NoDisplayName


2 Answers

What you can do instead is to generate a Base64-encoded string to be used as a confirmation token. This confirmation token will then be saved to your DB and passed as params to the activation link. Your activation url would look something like:

activation_url(MyApp.Endpoint, :confirm, confirm_id: confirm_id) 

The above url helper assumes you have a MyApp.ActivationController and a confirm/2 action in that controller. To generate the confirm_id, you could do:

def random_string(length) do   :crypto.strong_rand_bytes(length) |> Base.url_encode64 |> binary_part(0, length) end  # random_string(64) 

In your MyApp.ActivationController.confirm/2, you could have code lik:

def confirm(conn, %{"confirm_id" => confirm_id}) do   user = Repo.get_by(User, confirm_id: confirm_id)   User.confirm(user)   conn   |> put_flash(:info, "Account confirmed!")   |> redirect(to: "/") end 

Hope that helps!

like image 190
Gjaldon Avatar answered Sep 23 '22 01:09

Gjaldon


You can easily define a module to do this. In this example, @chars determines what characters appear in your generated strings.

defmodule StringGenerator do   @chars "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |> String.split("")    def string_of_length(length) do     Enum.reduce((1..length), [], fn (_i, acc) ->       [Enum.random(@chars) | acc]     end) |> Enum.join("")   end end  StringGenerator.string_of_length(3) # => "YCZ" 
like image 20
Nathan Long Avatar answered Sep 23 '22 01:09

Nathan Long