@@ -178,6 +178,22 @@ def valid_message?(signed_message)
178
178
#
179
179
# incompatible_message = "test--dad7b06c94abba8d46a15fafaef56c327665d5ff"
180
180
# verifier.verified(incompatible_message) # => TypeError: incompatible marshal file format
181
+ #
182
+ # ==== Options
183
+ #
184
+ # [+:purpose+]
185
+ # The purpose that the message was generated with. If the purpose does not
186
+ # match, +verified+ will return +nil+.
187
+ #
188
+ # message = verifier.generate("hello", purpose: "greeting")
189
+ # verifier.verified(message, purpose: "greeting") # => "hello"
190
+ # verifier.verified(message, purpose: "chatting") # => nil
191
+ # verifier.verified(message) # => nil
192
+ #
193
+ # message = verifier.generate("bye")
194
+ # verifier.verified(message) # => "bye"
195
+ # verifier.verified(message, purpose: "greeting") # => nil
196
+ #
181
197
def verified ( signed_message , purpose : nil , **)
182
198
data , digest = get_data_and_digest_from ( signed_message )
183
199
if digest_matches_data? ( digest , data )
@@ -203,6 +219,22 @@ def verified(signed_message, purpose: nil, **)
203
219
#
204
220
# other_verifier = ActiveSupport::MessageVerifier.new("different_secret")
205
221
# other_verifier.verify(signed_message) # => ActiveSupport::MessageVerifier::InvalidSignature
222
+ #
223
+ # ==== Options
224
+ #
225
+ # [+:purpose+]
226
+ # The purpose that the message was generated with. If the purpose does not
227
+ # match, +verify+ will raise ActiveSupport::MessageVerifier::InvalidSignature.
228
+ #
229
+ # message = verifier.generate("hello", purpose: "greeting")
230
+ # verifier.verify(message, purpose: "greeting") # => "hello"
231
+ # verifier.verify(message, purpose: "chatting") # => raises InvalidSignature
232
+ # verifier.verify(message) # => raises InvalidSignature
233
+ #
234
+ # message = verifier.generate("bye")
235
+ # verifier.verify(message) # => "bye"
236
+ # verifier.verify(message, purpose: "greeting") # => raises InvalidSignature
237
+ #
206
238
def verify ( *args , **options )
207
239
verified ( *args , **options ) || raise ( InvalidSignature )
208
240
end
@@ -214,6 +246,33 @@ def verify(*args, **options)
214
246
#
215
247
# verifier = ActiveSupport::MessageVerifier.new("secret")
216
248
# verifier.generate("signed message") # => "BAhJIhNzaWduZWQgbWVzc2FnZQY6BkVU--f67d5f27c3ee0b8483cebf2103757455e947493b"
249
+ #
250
+ # ==== Options
251
+ #
252
+ # [+:expires_at+]
253
+ # The datetime at which the message expires. After this datetime,
254
+ # verification of the message will fail.
255
+ #
256
+ # message = verifier.generate("hello", expires_at: Time.now.tomorrow)
257
+ # verifier.verified(message) # => "hello"
258
+ # # 24 hours later...
259
+ # verifier.verified(message) # => nil
260
+ # verifier.verify(message) # => raises ActiveSupport::MessageVerifier::InvalidSignature
261
+ #
262
+ # [+:expires_in+]
263
+ # The duration for which the message is valid. After this duration has
264
+ # elapsed, verification of the message will fail.
265
+ #
266
+ # message = verifier.generate("hello", expires_in: 24.hours)
267
+ # verifier.verified(message) # => "hello"
268
+ # # 24 hours later...
269
+ # verifier.verified(message) # => nil
270
+ # verifier.verify(message) # => raises ActiveSupport::MessageVerifier::InvalidSignature
271
+ #
272
+ # [+:purpose+]
273
+ # The purpose of the message. If specified, the same purpose must be
274
+ # specified when verifying the message; otherwise, verification will fail.
275
+ # (See #verified and #verify.)
217
276
def generate ( value , expires_at : nil , expires_in : nil , purpose : nil )
218
277
data = encode ( Messages ::Metadata . wrap ( @serializer . dump ( value ) , expires_at : expires_at , expires_in : expires_in , purpose : purpose ) )
219
278
"#{ data } #{ SEPARATOR } #{ generate_digest ( data ) } "
0 commit comments