@@ -64,6 +64,7 @@ defmodule GenEdgehogJwt do
6464 % { }
6565 |> add_type_claim ( opts [ :token_type ] )
6666 |> add_expiry_claim ( opts [ :expiry ] )
67+ |> add_auth_claims ( opts )
6768
6869 case Joken . generate_and_sign ( % { } , claims , signer ) do
6970 { :ok , token , _claims } ->
@@ -78,14 +79,34 @@ defmodule GenEdgehogJwt do
7879 defp parse_args ( args ) do
7980 args
8081 |> OptionParser . parse! (
81- switches: [ private_key: :string , expiry: :integer , token_type: :string ] ,
82- aliases: [ k: :private_key , e: :expiry , t: :token_type ]
82+ switches: [
83+ private_key: :string ,
84+ expiry: :integer ,
85+ token_type: :string ,
86+ subject: :string ,
87+ audience: :string ,
88+ preferred_username: :string ,
89+ email: :string ,
90+ given_name: :string ,
91+ family_name: :string
92+ ] ,
93+ aliases: [
94+ k: :private_key ,
95+ e: :expiry ,
96+ t: :token_type ,
97+ s: :subject ,
98+ a: :audience ,
99+ u: :preferred_username ,
100+ m: :email ,
101+ n: :given_name ,
102+ N: :family_name
103+ ]
83104 )
84105 |> validate_args ( )
85106 rescue
86107 e in OptionParser.ParseError ->
87108 print_usage ( )
88- IO . puts ( :stderr , "#{ @ red } gen-edgehog-jwt: error: #{ e . message } #{ @ reset } " )
109+ IO . puts ( :stderr , "#{ @ red } gen-edgehog-jwt: error: #{ e . message } #{ @ reset } " )
89110 System . halt ( 1 )
90111 end
91112
@@ -94,28 +115,39 @@ defmodule GenEdgehogJwt do
94115 ! opts [ :private_key ] ->
95116 print_usage ( )
96117
97- IO . puts ( :stderr , "#{ @ red } gen-edgehog-jwt: error: the following arguments are required: -k/--private-key#{ @ reset } " )
118+ IO . puts (
119+ :stderr ,
120+ "#{ @ red } gen-edgehog-jwt: error: the following arguments are required: -k/--private-key#{ @ reset } "
121+ )
98122
99123 System . halt ( 1 )
100124
101125 ! opts [ :token_type ] ->
102126 print_usage ( )
103127
104- IO . puts ( :stderr , "#{ @ red } gen-edgehog-jwt: error: the following arguments are required: -t/--token-type#{ @ reset } " )
128+ IO . puts (
129+ :stderr ,
130+ "#{ @ red } gen-edgehog-jwt: error: the following arguments are required: -t/--token-type#{ @ reset } "
131+ )
105132
106133 System . halt ( 1 )
107134
108135 opts [ :token_type ] not in [ "tenant" , "admin" ] ->
109136 print_usage ( )
110137
111- IO . puts ( :stderr ,
138+ IO . puts (
139+ :stderr ,
112140 "#{ @ red } gen-edgehog-jwt: error: invalid token type '#{ opts [ :token_type ] } '. Choose 'tenant' or 'admin'.#{ @ reset } "
113141 )
114142
115143 System . halt ( 1 )
116144
117145 true ->
118- opts = Keyword . put_new ( opts , :expiry , 86_400 )
146+ opts =
147+ opts
148+ |> Keyword . put_new ( :expiry , 86_400 )
149+ |> Keyword . put ( :issued_at , DateTime . to_unix ( DateTime . utc_now ( ) ) )
150+
119151 { opts , rest }
120152 end
121153 end
@@ -138,8 +170,35 @@ defmodule GenEdgehogJwt do
138170 Map . put ( claims , "exp" , exp )
139171 end
140172
173+ defp add_auth_claims ( claims , opts ) do
174+ subject_claim = opts [ :subject ]
175+ audience_claim = opts [ :audience ]
176+ username_claim = opts [ :preferred_username ]
177+ email_claim = opts [ :email ]
178+ given_name_claim = opts [ :given_name ]
179+ family_name_claim = opts [ :family_name ]
180+
181+ auth_time_claim =
182+ opts [ :issued_at ]
183+ |> DateTime . from_unix ( )
184+ |> elem ( 1 )
185+ |> DateTime . add ( 1 , :second )
186+ |> DateTime . to_unix ( )
187+
188+ claims
189+ |> Map . put ( "sub" , subject_claim )
190+ |> Map . put ( "aud" , audience_claim )
191+ |> Map . put ( "preferred_username" , username_claim )
192+ |> Map . put ( "email" , email_claim )
193+ |> Map . put ( "given_name" , given_name_claim )
194+ |> Map . put ( "family_name" , family_name_claim )
195+ |> Map . put ( "auth_time" , auth_time_claim )
196+ end
197+
141198 defp print_usage do
142- IO . puts ( "usage: gen-edgehog-jwt [-h] -k PRIVATE_KEY [-e EXPIRY] -t {tenant,admin}" )
199+ IO . puts (
200+ "usage: gen-edgehog-jwt [-h] -k PRIVATE_KEY [-e EXPIRY] -t {tenant,admin} -s SUBJECT -a AUDIENCE -u PREFERRED_USERNAME -m EMAIL_ADDRESS -n GIVEN_NAME -N FAMILY_NAME"
201+ )
143202 end
144203
145204 defp print_help do
@@ -152,22 +211,32 @@ defmodule GenEdgehogJwt do
152211 Supports both #{ @ green } tenant#{ @ reset } and #{ @ green } admin#{ @ reset } tokens.
153212
154213 #{ @ yellow } Required Options:#{ @ reset }
155- #{ @ green } -k, --private-key PATH#{ @ reset } Path to your private key file (RSA or EC)
156- #{ @ green } -t, --token-type TYPE#{ @ reset } Token type: #{ @ green } tenant#{ @ reset } or #{ @ green } admin#{ @ reset }
214+ #{ @ green } -k, --private-key PATH#{ @ reset } Path to your private key file (RSA or EC)
215+ #{ @ green } -t, --token-type TYPE#{ @ reset } Token type: #{ @ green } tenant#{ @ reset } or #{ @ green } admin#{ @ reset }
157216
158217 #{ @ yellow } Optional Options:#{ @ reset }
159218 #{ @ green } -e, --expiry SECONDS#{ @ reset } Token expiration time in seconds (default: 86400); set to #{ @ green } 0#{ @ reset } for no expiration
160219 #{ @ green } -h, --help#{ @ reset } Display this help message
220+ #{ @ green } -s, --subject SUBJECT#{ @ reset } Subject Identifier, a unique and never reassigned identifier. Max 255 ASCII characters
221+ #{ @ green } -a, --audience AUDIENCE#{ @ reset } The OAuth2 client_id of the of the Client requesting auth on behalf of the user
222+ #{ @ green } -u, --preferred-username USERNAME#{ @ reset } Username of the user
223+ #{ @ green } -m, --email EMAIL#{ @ reset } Email address of the user
224+ #{ @ green } -n, --given-name GIVEN_NAME#{ @ reset } Given name of the user
225+ #{ @ green } -N, --family-name FAMILY_NAME#{ @ reset } Family name of the user
226+
227+ #{ @ blue } AUTH_OPTIONS#{ @ reset }
228+ Options used for authentication and authorization of the user's client:
229+ #{ @ green } --subject#{ @ reset } , #{ @ green } --audience#{ @ reset } , #{ @ green } --preferred-username#{ @ reset } , #{ @ green } --email#{ @ reset } , #{ @ green } --given-name#{ @ reset } , #{ @ green } --family-name#{ @ reset }
161230
162231 #{ @ yellow } Examples:#{ @ reset }
163232 #{ @ blue } # Generate a tenant token with default expiry (24 hours)#{ @ reset }
164- ./gen-edgehog-jwt -k private_key.pem -t tenant
233+ ./gen-edgehog-jwt -k private_key.pem -t tenant [AUTH_OPTIONS]
165234
166235 #{ @ blue } # Generate an admin token with 1 hour expiry#{ @ reset }
167- ./gen-edgehog-jwt -k private_key.pem -t admin -e 3600
236+ ./gen-edgehog-jwt -k private_key.pem -t admin -e 3600 [AUTH_OPTIONS]
168237
169238 #{ @ blue } # Generate a token with no expiration#{ @ reset }
170- ./gen-edgehog-jwt -k private_key.pem -t tenant -e 0
239+ ./gen-edgehog-jwt -k private_key.pem -t tenant -e 0 [AUTH_OPTIONS]
171240 """ )
172241 end
173242end
0 commit comments