Skip to content

Instantly share code, notes, and snippets.

@logicmason
Created December 19, 2016 16:43
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save logicmason/d1ce252f6a140d914933661af0878c9f to your computer and use it in GitHub Desktop.
Save logicmason/d1ce252f6a140d914933661af0878c9f to your computer and use it in GitHub Desktop.
Generate tokens for Twilio Programable video
# my_app/web/controllers/auth_controller.ex
defmodule MyApp.AuthController do
use MyApp.Web, :controller
import Ecto.Query
alias MyApp.TwilioToken
# Connect this to a route for /token:identity
def token(conn, %{"identity" => identity}) do
token = TwilioToken.for_video(identity)
json conn, %{token: token, identity: identity}
end
end
# my_app/web/twilio_token.ex
defmodule MyApp.TwilioToken do
# Generates token for Twilio Programmable video
# Assumes Joken is in Mix.exs deps and Twilio creds are in app config
def for_video(identity) do
sid = config[:TWILIO_ACCOUNT_SID]
api_key = config[:TWILIO_API_KEY]
api_secret = config[:TWILIO_API_SECRET]
rtc_profile_sid = config[:TWILIO_CONFIGURATION_SID]
now = epoch_ts()
exp = now + 3600
payload = %{
"jti" => "#{api_key}-#{now}",
"iss" => api_key,
"sub" => sid,
"exp" => exp,
"grants" => %{
"identity" => identity,
"rtc" => %{
"configuration_profile_sid" => rtc_profile_sid
}
}
}
payload
|> Joken.token()
|> Joken.with_header_arg("cty", "twilio-fpa;v=1")
|> Joken.with_signer(Joken.hs256(api_secret))
|> Joken.sign()
|> Joken.get_compact()
end
defp epoch_ts() do
epoch = {{1970, 1, 1}, {0, 0, 0}}
epoch_i = :calendar.datetime_to_gregorian_seconds(epoch)
now_i = :calendar.datetime_to_gregorian_seconds(:calendar.universal_time)
now_i - epoch_i
end
def config, do: Application.get_env(:my_app, __MODULE__)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment