rack-simple_auth 1.0.0rc → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +7 -7
  2. data/MANIFEST +26 -26
  3. data/README.rdoc +121 -0
  4. data/checksum/rack-simple_auth-1.0.0.gem.sha512 +1 -0
  5. data/checksum/rack-simple_auth-1.0.0rc.gem.sha512 +1 -0
  6. data/doc/Rack.html +128 -0
  7. data/doc/Rack/SimpleAuth.html +252 -0
  8. data/doc/Rack/SimpleAuth/HMAC.html +128 -0
  9. data/doc/Rack/SimpleAuth/HMAC/Config.html +1003 -0
  10. data/doc/Rack/SimpleAuth/HMAC/Middleware.html +1418 -0
  11. data/doc/Rack/SimpleAuth/Logger.html +264 -0
  12. data/doc/_index.html +185 -0
  13. data/doc/class_list.html +54 -0
  14. data/doc/css/common.css +1 -0
  15. data/doc/css/full_list.css +57 -0
  16. data/doc/css/style.css +339 -0
  17. data/doc/examples/index.php +32 -0
  18. data/{test/rack/simple_auth/hmac/config.ru → doc/examples/rack_lobster.ru} +1 -2
  19. data/doc/file.README.html +221 -0
  20. data/doc/file_list.html +56 -0
  21. data/doc/frames.html +26 -0
  22. data/doc/index.html +221 -0
  23. data/doc/js/app.js +219 -0
  24. data/doc/js/full_list.js +178 -0
  25. data/doc/js/jquery.js +4 -0
  26. data/doc/method_list.html +179 -0
  27. data/doc/top-level-namespace.html +112 -0
  28. data/lib/rack/simple_auth.rb +3 -1
  29. data/lib/rack/simple_auth/hmac/config.rb +46 -8
  30. data/lib/rack/simple_auth/hmac/middleware.rb +102 -75
  31. data/lib/rack/simple_auth/logger.rb +8 -3
  32. data/lib/rack/simple_auth/version.rb +1 -1
  33. metadata +91 -105
  34. data/.gitignore +0 -18
  35. data/.rubocop.yml +0 -1
  36. data/.travis.yml +0 -22
  37. data/.yardopts +0 -1
  38. data/Gemfile +0 -4
  39. data/README.md +0 -68
  40. data/Rakefile +0 -8
  41. data/rubocop-todo.yml +0 -19
  42. data/task/build.rake +0 -4
  43. data/task/checksum.rake +0 -15
  44. data/task/console.rake +0 -7
  45. data/task/default.rake +0 -6
  46. data/task/floodtest.rake +0 -34
  47. data/task/manifest.rake +0 -8
  48. data/task/test.rake +0 -23
  49. data/test/rack/simple_auth/hmac/config_fail.ru +0 -23
  50. data/test/rack/simple_auth/hmac/config_fail_option.ru +0 -24
  51. data/test/rack/simple_auth/hmac/config_fail_run.ru +0 -22
  52. data/test/rack/simple_auth/hmac/config_fail_step.ru +0 -23
  53. data/test/rack/simple_auth/hmac/config_fail_tolerance.ru +0 -23
  54. data/test/rack/simple_auth/hmac/hmac_fail_run_test.rb +0 -26
  55. data/test/rack/simple_auth/hmac/hmac_fail_test.rb +0 -38
  56. data/test/rack/simple_auth/hmac/hmac_test.rb +0 -128
  57. data/test/test_helper.rb +0 -50
@@ -0,0 +1 @@
1
+ /* Override this file with custom rules */
@@ -0,0 +1,57 @@
1
+ body {
2
+ margin: 0;
3
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
+ font-size: 13px;
5
+ height: 101%;
6
+ overflow-x: hidden;
7
+ }
8
+
9
+ h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
10
+ .clear { clear: both; }
11
+ #search { position: absolute; right: 5px; top: 9px; padding-left: 24px; }
12
+ #content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; }
13
+ #full_list { padding: 0; list-style: none; margin-left: 0; }
14
+ #full_list ul { padding: 0; }
15
+ #full_list li { padding: 5px; padding-left: 12px; margin: 0; font-size: 1.1em; list-style: none; }
16
+ #noresults { padding: 7px 12px; }
17
+ #content.insearch #noresults { margin-left: 7px; }
18
+ ul.collapsed ul, ul.collapsed li { display: none; }
19
+ ul.collapsed.search_uncollapsed { display: block; }
20
+ ul.collapsed.search_uncollapsed li { display: list-item; }
21
+ li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; }
22
+ li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
23
+ li { color: #888; cursor: pointer; }
24
+ li.deprecated { text-decoration: line-through; font-style: italic; }
25
+ li.r1 { background: #f0f0f0; }
26
+ li.r2 { background: #fafafa; }
27
+ li:hover { background: #ddd; }
28
+ li small:before { content: "("; }
29
+ li small:after { content: ")"; }
30
+ li small.search_info { display: none; }
31
+ a:link, a:visited { text-decoration: none; color: #05a; }
32
+ li.clicked { background: #05a; color: #ccc; }
33
+ li.clicked a:link, li.clicked a:visited { color: #eee; }
34
+ li.clicked a.toggle { opacity: 0.5; background-position: bottom right; }
35
+ li.collapsed.clicked a.toggle { background-position: top right; }
36
+ #search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
37
+ #nav { margin-left: 10px; font-size: 0.9em; display: none; color: #aaa; }
38
+ #nav a:link, #nav a:visited { color: #358; }
39
+ #nav a:hover { background: transparent; color: #5af; }
40
+ .frames #nav span:after { content: ' | '; }
41
+ .frames #nav span:last-child:after { content: ''; }
42
+
43
+ .frames #content h1 { margin-top: 0; }
44
+ .frames li { white-space: nowrap; cursor: normal; }
45
+ .frames li small { display: block; font-size: 0.8em; }
46
+ .frames li small:before { content: ""; }
47
+ .frames li small:after { content: ""; }
48
+ .frames li small.search_info { display: none; }
49
+ .frames #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; }
50
+ .frames #content.insearch #search { background-position: center right; }
51
+ .frames #search input { width: 110px; }
52
+ .frames #nav { display: block; }
53
+
54
+ #full_list.insearch li { display: none; }
55
+ #full_list.insearch li.found { display: list-item; padding-left: 10px; }
56
+ #full_list.insearch li a.toggle { display: none; }
57
+ #full_list.insearch li small.search_info { display: block; }
data/doc/css/style.css ADDED
@@ -0,0 +1,339 @@
1
+ body {
2
+ padding: 0 20px;
3
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
4
+ font-size: 13px;
5
+ }
6
+ body.frames { padding: 0 5px; }
7
+ h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; }
8
+ h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; }
9
+ h1.title { margin-bottom: 10px; }
10
+ h1.alphaindex { margin-top: 0; font-size: 22px; }
11
+ h2 {
12
+ padding: 0;
13
+ padding-bottom: 3px;
14
+ border-bottom: 1px #aaa solid;
15
+ font-size: 1.4em;
16
+ margin: 1.8em 0 0.5em;
17
+ }
18
+ h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right; }
19
+ .clear { clear: both; }
20
+ .inline { display: inline; }
21
+ .inline p:first-child { display: inline; }
22
+ .docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; }
23
+ .docstring h1 { font-size: 1.2em; }
24
+ .docstring h2 { font-size: 1.1em; }
25
+ .docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; }
26
+ .summary_desc .object_link, .docstring .object_link { font-family: monospace; }
27
+ .rdoc-term { padding-right: 25px; font-weight: bold; }
28
+ .rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; }
29
+
30
+ /* style for <table> */
31
+ #filecontents table, .docstring table { border-collapse: collapse; }
32
+ #filecontents table th, #filecontents table td,
33
+ .docstring table th, .docstring table td { border: 1px solid #ccc; padding: 8px; padding-right: 17px; }
34
+ #filecontents table tr:nth-child(odd),
35
+ .docstring table tr:nth-child(odd) { background: #eee; }
36
+ #filecontents table tr:nth-child(even),
37
+ .docstring table tr:nth-child(even) { background: #fff; }
38
+ #filecontents table th, .docstring table th { background: #fff; }
39
+
40
+ /* style for <ul> */
41
+ #filecontents li > p, .docstring li > p { margin: 0px; }
42
+ #filecontents ul, .docstring ul { padding-left: 20px; }
43
+ /* style for <dl> */
44
+ #filecontents dl, .docstring dl { border: 1px solid #ccc; }
45
+ #filecontents dt, .docstring dt { background: #ddd; font-weight: bold; padding: 3px 5px; }
46
+ #filecontents dd, .docstring dd { padding: 5px 0px; margin-left: 18px; }
47
+ #filecontents dd > p, .docstring dd > p { margin: 0px; }
48
+
49
+ .note {
50
+ color: #222;
51
+ -moz-border-radius: 3px; -webkit-border-radius: 3px;
52
+ background: #e3e4e3; border: 1px solid #d5d5d5; padding: 7px 10px;
53
+ display: block;
54
+ }
55
+ .note.todo { background: #ffffc5; border-color: #ececaa; }
56
+ .note.returns_void { background: #efefef; }
57
+ .note.deprecated { background: #ffe5e5; border-color: #e9dada; }
58
+ .note.private { background: #ffffc5; border-color: #ececaa; }
59
+ .note.title { padding: 1px 5px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; }
60
+ .summary_signature + .note.title { margin-left: 7px; }
61
+ h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; }
62
+ .note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
63
+ .note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
64
+ .note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
65
+ .note.title.private { background: #d5d5d5; border-color: #c5c5c5; }
66
+ .note.title.not_defined_here { background: transparent; border: none; font-style: italic; }
67
+ .discussion .note { margin-top: 6px; }
68
+ .discussion .note:first-child { margin-top: 0; }
69
+
70
+ h3.inherited {
71
+ font-style: italic;
72
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
73
+ font-weight: normal;
74
+ padding: 0;
75
+ margin: 0;
76
+ margin-top: 12px;
77
+ margin-bottom: 3px;
78
+ font-size: 13px;
79
+ }
80
+ p.inherited {
81
+ padding: 0;
82
+ margin: 0;
83
+ margin-left: 25px;
84
+ }
85
+
86
+ #filecontents dl.box, dl.box {
87
+ border: 0;
88
+ width: 520px;
89
+ font-size: 1em;
90
+ }
91
+ #filecontents dl.box dt, dl.box dt {
92
+ float: left;
93
+ display: block;
94
+ width: 100px;
95
+ margin: 0;
96
+ text-align: right;
97
+ font-weight: bold;
98
+ background: transparent;
99
+ border: 1px solid #aaa;
100
+ border-width: 1px 0px 0px 1px;
101
+ padding: 6px 0;
102
+ padding-right: 10px;
103
+ }
104
+ #filecontents dl.box dd, dl.box dd {
105
+ float: left;
106
+ display: block;
107
+ width: 380px;
108
+ margin: 0;
109
+ padding: 6px 0;
110
+ padding-right: 20px;
111
+ border: 1px solid #aaa;
112
+ border-width: 1px 1px 0 0;
113
+ }
114
+ #filecontents dl.box .last, dl.box .last {
115
+ border-bottom: 1px solid #aaa;
116
+ }
117
+ #filecontents dl.box .r1, dl.box .r1 { background: #eee; }
118
+
119
+ ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; }
120
+ .index_inline_list { padding-left: 0; font-size: 1.1em; }
121
+ .index_inline_list li { list-style: none; display: inline; padding: 7px 12px; line-height: 35px; }
122
+
123
+ dl.constants { margin-left: 40px; }
124
+ dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; }
125
+ dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; }
126
+
127
+ .summary_desc { margin-left: 32px; display: block; font-family: sans-serif; }
128
+ .summary_desc tt { font-size: 0.9em; }
129
+ dl.constants .note { padding: 2px 6px; padding-right: 12px; margin-top: 6px; }
130
+ dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; }
131
+ dl.constants .tags { padding-left: 32px; font-size: 0.9em; line-height: 0.8em; }
132
+ dl.constants .discussion *:first-child { margin-top: 0; }
133
+ dl.constants .discussion *:last-child { margin-bottom: 0; }
134
+
135
+ .method_details { border-top: 1px dotted #aaa; margin-top: 15px; padding-top: 0; }
136
+ .method_details.first { border: 0; }
137
+ p.signature, h3.signature {
138
+ font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
139
+ padding: 6px 10px; margin-top: 18px;
140
+ background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
141
+ }
142
+ p.signature tt,
143
+ h3.signature tt { font-family: Monaco, Consolas, Courier, monospace; }
144
+ p.signature .overload,
145
+ h3.signature .overload { display: block; }
146
+ p.signature .extras,
147
+ h3.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; }
148
+ p.signature .not_defined_here,
149
+ h3.signature .not_defined_here,
150
+ p.signature .aliases,
151
+ h3.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; }
152
+ p.signature .aliases .names,
153
+ h3.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; }
154
+
155
+ .tags .tag_title { font-size: 1em; margin-bottom: 0; font-weight: bold; }
156
+ .tags ul { margin-top: 5px; padding-left: 30px; list-style: square; }
157
+ .tags ul li { margin-bottom: 3px; }
158
+ .tags ul .name { font-family: monospace; font-weight: bold; }
159
+ .tags ul .note { padding: 3px 6px; }
160
+ .tags { margin-bottom: 12px; }
161
+
162
+ .tags .examples .tag_title { margin-bottom: 10px; font-weight: bold; }
163
+ .tags .examples .inline p { padding: 0; margin: 0; margin-left: 15px; font-weight: bold; font-size: 0.9em; }
164
+
165
+ .tags .overload .overload_item { list-style: none; margin-bottom: 25px; }
166
+ .tags .overload .overload_item .signature {
167
+ padding: 2px 8px;
168
+ background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
169
+ }
170
+ .tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; }
171
+ .tags .overload .docstring { margin-top: 15px; }
172
+
173
+ .defines { display: none; }
174
+
175
+ #method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; }
176
+
177
+ .showSource { font-size: 0.9em; }
178
+ .showSource a:link, .showSource a:visited { text-decoration: none; color: #666; }
179
+
180
+ #content a:link, #content a:visited { text-decoration: none; color: #05a; }
181
+ #content a:hover { background: #ffffa5; }
182
+ div.docstring, p.docstring { margin-right: 6em; }
183
+
184
+ ul.summary {
185
+ list-style: none;
186
+ font-family: monospace;
187
+ font-size: 1em;
188
+ line-height: 1.5em;
189
+ }
190
+ ul.summary a:link, ul.summary a:visited {
191
+ text-decoration: none; font-size: 1.1em;
192
+ }
193
+ ul.summary li { margin-bottom: 5px; }
194
+ .summary .summary_signature {
195
+ padding: 1px 10px;
196
+ background: #eaeaff; border: 1px solid #dfdfe5;
197
+ -moz-border-radius: 3px; -webkit-border-radius: 3px;
198
+ }
199
+ .summary_signature:hover { background: #eeeeff; cursor: pointer; }
200
+ ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;}
201
+ ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; }
202
+ #content .summary_signature:hover a:link,
203
+ #content .summary_signature:hover a:visited {
204
+ background: transparent;
205
+ color: #48f;
206
+ }
207
+
208
+ p.inherited a { font-family: monospace; font-size: 0.9em; }
209
+ p.inherited { word-spacing: 5px; font-size: 1.2em; }
210
+
211
+ p.children { font-size: 1.2em; }
212
+ p.children a { font-size: 0.9em; }
213
+ p.children strong { font-size: 0.8em; }
214
+ p.children strong.modules { padding-left: 5px; }
215
+
216
+ ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; }
217
+ ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; }
218
+ ul.fullTree li { text-align: center; padding-top: 18px; padding-bottom: 12px; background: url(data:image/gif;base64,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) no-repeat top center; }
219
+ ul.fullTree li:first-child { padding-top: 0; background: transparent; }
220
+ ul.fullTree li:last-child { padding-bottom: 0; }
221
+ .showAll ul.fullTree { display: block; }
222
+ .showAll .inheritName { display: none; }
223
+
224
+ #search { position: absolute; right: 14px; top: 0px; }
225
+ #search a:link, #search a:visited {
226
+ display: block; float: left; margin-right: 4px;
227
+ padding: 8px 10px; text-decoration: none; color: #05a;
228
+ border: 1px solid #d8d8e5;
229
+ -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;
230
+ -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px;
231
+ background: #eaf0ff;
232
+ -webkit-box-shadow: -1px 1px 3px #ddd;
233
+ }
234
+ #search a:hover { background: #f5faff; color: #06b; }
235
+ #search a.active {
236
+ background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457;
237
+ -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px;
238
+ -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px;
239
+ }
240
+ #search a.inactive { color: #999; }
241
+ .frames #search { display: none; }
242
+ .inheritanceTree, .toggleDefines { float: right; }
243
+
244
+ #menu { font-size: 1.3em; color: #bbb; top: -5px; position: relative; }
245
+ #menu .title, #menu a { font-size: 0.7em; }
246
+ #menu .title a { font-size: 1em; }
247
+ #menu .title { color: #555; }
248
+ #menu a:link, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; }
249
+ #menu a:hover { color: #05a; }
250
+ #menu .noframes { display: inline; }
251
+ .frames #menu .noframes { display: inline; float: right; }
252
+
253
+ #footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; }
254
+ #footer a:link, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; }
255
+ #footer a:hover { color: #05a; }
256
+
257
+ #listing ul.alpha { font-size: 1.1em; }
258
+ #listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; }
259
+ #listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; }
260
+ #listing ul.alpha ul { margin: 0; padding-left: 15px; }
261
+ #listing ul small { color: #666; font-size: 0.7em; }
262
+
263
+ li.r1 { background: #f0f0f0; }
264
+ li.r2 { background: #fafafa; }
265
+
266
+ #search_frame {
267
+ z-index: 9999;
268
+ background: #fff;
269
+ display: none;
270
+ position: absolute;
271
+ top: 36px;
272
+ right: 18px;
273
+ width: 500px;
274
+ height: 80%;
275
+ overflow-y: scroll;
276
+ border: 1px solid #999;
277
+ border-collapse: collapse;
278
+ -webkit-box-shadow: -7px 5px 25px #aaa;
279
+ -moz-box-shadow: -7px 5px 25px #aaa;
280
+ -moz-border-radius: 2px;
281
+ -webkit-border-radius: 2px;
282
+ }
283
+
284
+ #content ul.summary li.deprecated .summary_signature a:link,
285
+ #content ul.summary li.deprecated .summary_signature a:visited { text-decoration: line-through; font-style: italic; }
286
+
287
+ #toc {
288
+ padding: 20px; padding-right: 30px; border: 1px solid #ddd; float: right; background: #fff; margin-left: 20px; margin-bottom: 20px;
289
+ max-width: 300px;
290
+ -webkit-box-shadow: -2px 2px 6px #bbb;
291
+ -moz-box-shadow: -2px 2px 6px #bbb;
292
+ z-index: 5000;
293
+ position: relative;
294
+ overflow-x: auto;
295
+ }
296
+ #toc.nofloat { float: none; max-width: none; border: none; padding: 0; margin: 20px 0; -webkit-box-shadow: none; -moz-box-shadow: none; }
297
+ #toc.nofloat.hidden { padding: 0; background: 0; margin-bottom: 5px; }
298
+ #toc .title { margin: 0; }
299
+ #toc ol { padding-left: 1.8em; }
300
+ #toc li { font-size: 1.1em; line-height: 1.7em; }
301
+ #toc > ol > li { font-size: 1.1em; font-weight: bold; }
302
+ #toc ol > ol { font-size: 0.9em; }
303
+ #toc ol ol > ol { padding-left: 2.3em; }
304
+ #toc ol + li { margin-top: 0.3em; }
305
+ #toc.hidden { padding: 10px; background: #f6f6f6; -webkit-box-shadow: none; -moz-box-shadow: none; }
306
+ #filecontents h1 + #toc.nofloat { margin-top: 0; }
307
+
308
+ /* syntax highlighting */
309
+ .source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; }
310
+ #filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; }
311
+ #filecontents pre.code, .docstring pre.code { display: block; }
312
+ .source_code .lines { padding-right: 12px; color: #555; text-align: right; }
313
+ #filecontents pre.code, .docstring pre.code,
314
+ .tags pre.example { padding: 5px 12px; margin-top: 4px; border: 1px solid #eef; background: #f5f5ff; }
315
+ pre.code { color: #000; }
316
+ pre.code .info.file { color: #555; }
317
+ pre.code .val { color: #036A07; }
318
+ pre.code .tstring_content,
319
+ pre.code .heredoc_beg, pre.code .heredoc_end,
320
+ pre.code .qwords_beg, pre.code .qwords_end,
321
+ pre.code .tstring, pre.code .dstring { color: #036A07; }
322
+ pre.code .fid, pre.code .rubyid_new, pre.code .rubyid_to_s,
323
+ pre.code .rubyid_to_sym, pre.code .rubyid_to_f,
324
+ pre.code .dot + pre.code .id,
325
+ pre.code .rubyid_to_i pre.code .rubyid_each { color: #0085FF; }
326
+ pre.code .comment { color: #0066FF; }
327
+ pre.code .const, pre.code .constant { color: #585CF6; }
328
+ pre.code .label,
329
+ pre.code .symbol { color: #C5060B; }
330
+ pre.code .kw,
331
+ pre.code .rubyid_require,
332
+ pre.code .rubyid_extend,
333
+ pre.code .rubyid_include { color: #0000FF; }
334
+ pre.code .ivar { color: #318495; }
335
+ pre.code .gvar,
336
+ pre.code .rubyid_backref,
337
+ pre.code .rubyid_nth_ref { color: #6D79DE; }
338
+ pre.code .regexp, .dregexp { color: #036A07; }
339
+ pre.code a { border-bottom: 1px dotted #bbf; }
@@ -0,0 +1,32 @@
1
+ <?php
2
+ $message = array('method' => 'GET', 'date' => round(microtime(true) * 1000), 'data' => "/test" );
3
+
4
+ echo json_encode($message, JSON_UNESCAPED_SLASHES);
5
+ $hash = hash_hmac('sha256', json_encode($message, JSON_UNESCAPED_SLASHES), 'test_secret', false);
6
+ $signature = 'test_signature';
7
+
8
+ $curl = curl_init();
9
+
10
+ curl_setopt_array($curl, array(
11
+ CURLOPT_RETURNTRANSFER => 1,
12
+ CURLOPT_URL => 'http://localhost:9292/test',
13
+ CURLOPT_USERAGENT => 'Sample cURL Request'
14
+ ));
15
+
16
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array("AUTHORIZATION: $hash:$signature"));
17
+
18
+ $resp = curl_exec($curl);
19
+
20
+ curl_close($curl);
21
+ ?>
22
+ <html>
23
+ <head>
24
+ <title>HMAC Test</title>
25
+ <head>
26
+ <body>
27
+ <div class="wrapper">
28
+ <p>Sending request with AUTHORIZATION Header: <?php echo $hash.":".$signature; ?></p>
29
+ <p>PHP Request (via cURL) - Response: <?php echo $resp; ?> </p>
30
+ </div>
31
+ </body>
32
+ </html>
@@ -10,8 +10,7 @@ request_config = {
10
10
  }
11
11
 
12
12
  use Rack::SimpleAuth::HMAC::Middleware do |options|
13
- options.tolerance = 0.5
14
- options.stepsize = 0.01
13
+ options.tolerance = 100
15
14
 
16
15
  options.secret = 'test_secret'
17
16
  options.signature = 'test_signature'
@@ -0,0 +1,221 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <title>
7
+ File: README
8
+
9
+ &mdash; Documentation by YARD 0.8.7.4
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!file.README.html";
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+ <span class="title">File: README</span>
36
+
37
+
38
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
39
+ </div>
40
+
41
+ <div id="search">
42
+
43
+ <a class="full_list_link" id="class_list_link"
44
+ href="class_list.html">
45
+ Class List
46
+ </a>
47
+
48
+ <a class="full_list_link" id="method_list_link"
49
+ href="method_list.html">
50
+ Method List
51
+ </a>
52
+
53
+ <a class="full_list_link" id="file_list_link"
54
+ href="file_list.html">
55
+ File List
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <iframe id="search_frame"></iframe>
63
+
64
+ <div id="content"><div id='filecontents'>
65
+ <h1 id="label-What+is+Rack%3A%3ASimpleAuth">What is Rack::SimpleAuth</h1>
66
+
67
+ <p>Rack::SimpleAuth will contain different Authentication Class Middlewares</p>
68
+
69
+ <p>Until now only HMAC is implemented…</p>
70
+
71
+ <h2 id="label-Installation">Installation</h2>
72
+
73
+ <p>Add this line to your application&#39;s Gemfile:</p>
74
+
75
+ <pre class="code ruby"><code class="ruby">$ gem &#39;rack-simple_auth&#39;</code></pre>
76
+
77
+ <p>And then execute:</p>
78
+
79
+ <pre class="code ruby"><code class="ruby">$ bundle</code></pre>
80
+
81
+ <p>Or install it yourself as:</p>
82
+
83
+ <pre class="code ruby"><code class="ruby">$ gem install rack-simple_auth</code></pre>
84
+
85
+ <h2 id="label-Gem+Status">Gem Status</h2>
86
+
87
+ <p><a href="https://travis-ci.org/Benny1992/rack-simple_auth"><img
88
+ src="https://travis-ci.org/Benny1992/rack-simple_auth.svg?branch=v1.0.0rc"
89
+ alt="Build Status" /></a> <a
90
+ href="https://coveralls.io/r/Benny1992/rack-simple_auth"><img
91
+ src="https://coveralls.io/repos/Benny1992/rack-simple_auth/badge.png"
92
+ alt="Code Coverage" /></a> <a
93
+ href="http://badge.fury.io/rb/rack-simple_auth"><img
94
+ src="https://badge.fury.io/rb/rack-simple_auth.png" alt="Gem Version"
95
+ /></a> <a href="https://gemnasium.com/Benny1992/rack-simple_auth"><img
96
+ src="https://gemnasium.com/Benny1992/rack-simple_auth.png" alt="Dependency
97
+ Status" /></a> <a
98
+ href="https://www.codeship.io/projects/f2d9d790-b0fe-0131-3fd5-025f180094b5/status"><img
99
+ src="https://www.codeship.io/projects/f2d9d790-b0fe-0131-3fd5-025f180094b5/status"
100
+ alt="Build Status" /></a></p>
101
+
102
+ <h2 id="label-Usage">Usage</h2>
103
+
104
+ <h3 id="label-HMAC">HMAC</h3>
105
+
106
+ <p>To use HMAC Authorization you have to use the
107
+ Rack::SimpleAuth::HMAC::Middleware for your Rack App</p>
108
+
109
+ <p>Basic Usage:</p>
110
+
111
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>rack/lobster</span><span class='tstring_end'>&#39;</span></span>
112
+ <span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>rack/simple_auth</span><span class='tstring_end'>&#39;</span></span>
113
+
114
+ <span class='id identifier rubyid_request_config'>request_config</span> <span class='op'>=</span> <span class='lbrace'>{</span>
115
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>GET</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>path</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
116
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>POST</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>params</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
117
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>DELETE</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>path</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
118
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>PUT</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>path</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
119
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>PATCH</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>path</span><span class='tstring_end'>&#39;</span></span>
120
+ <span class='rbrace'>}</span>
121
+
122
+ <span class='id identifier rubyid_use'>use</span> <span class='const'>Rack</span><span class='op'>::</span><span class='const'>SimpleAuth</span><span class='op'>::</span><span class='const'>HMAC</span><span class='op'>::</span><span class='const'>Middleware</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_options'>options</span><span class='op'>|</span>
123
+ <span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_tolerance'>tolerance</span> <span class='op'>=</span> <span class='int'>1500</span> <span class='comment'># 1500ms -&gt; 1.5s
124
+ </span>
125
+ <span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_secret'>secret</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>test_secret</span><span class='tstring_end'>&#39;</span></span>
126
+ <span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_signature'>signature</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>test_signature</span><span class='tstring_end'>&#39;</span></span>
127
+
128
+ <span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_logpath'>logpath</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_expand_path'>expand_path</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>..</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>__FILE__</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>/logs</span><span class='tstring_end'>&quot;</span></span>
129
+ <span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_request_config'>request_config</span> <span class='op'>=</span> <span class='id identifier rubyid_request_config'>request_config</span>
130
+ <span class='kw'>end</span>
131
+
132
+ <span class='id identifier rubyid_run'>run</span> <span class='const'>Rack</span><span class='op'>::</span><span class='const'>Lobster</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
133
+ </code></pre>
134
+
135
+ <p>In general each request has a message (which is encrypted) in following
136
+ format:</p>
137
+
138
+ <pre class="code ruby"><code class="ruby"><span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>method</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='ivar'>@request</span><span class='period'>.</span><span class='id identifier rubyid_request_method'>request_method</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>date</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_date'>date</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>data</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_request_data'>request_data</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span>
139
+ </code></pre>
140
+
141
+ <p>For example accessing <tt>GET /test</tt> with this configuration represents
142
+ following message</p>
143
+
144
+ <pre class="code ruby"><code class="ruby"><span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>method</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>GET</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>date</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='int'>1398821451494</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>data</span><span class='tstring_end'>&#39;</span></span> <span class='op'>=&gt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>/test</span><span class='tstring_end'>&#39;</span></span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_to_json'>to_json</span>
145
+ </code></pre>
146
+
147
+ <p>With the tolerance there is an adjustable amount of messages wich are built
148
+ (Rack::SimpleAuth::HMAC::Middleware#allowed_messages)</p>
149
+
150
+ <p>This means a request could have a certain latency (delay) and the request
151
+ is still authorized</p>
152
+
153
+ <h4 id="label-Secure+your+REST+Api%3A">Secure your REST Api:</h4>
154
+
155
+ <p>To secure your REST Api you have to send the HTTP_AUTHORIZATION Header with
156
+ each request where the HMAC Middleware is used.</p>
157
+
158
+ <p>For example <tt>POST /form</tt> with params <tt>{ name =&gt; benny1992 }</tt> is secured
159
+ the following way:</p>
160
+
161
+ <p>Uncrypted Message:</p>
162
+
163
+ <pre class="code ruby"><code class="ruby">{ &#39;method&#39; =&gt; &#39;POST&#39;, &#39;date&#39; =&gt; timestamp +- tolerance, &#39;data&#39; =&gt; { &#39;name&#39; =&gt; &#39;benny1992&#39; } }.to_json
164
+ </code></pre>
165
+
166
+ <p>Encryption Mechanism:</p>
167
+
168
+ <pre class="code ruby"><code class="ruby"><span class='const'>OpenSSL</span><span class='op'>::</span><span class='const'>HMAC</span><span class='period'>.</span><span class='id identifier rubyid_hexdigest'>hexdigest</span><span class='lparen'>(</span><span class='const'>OpenSSL</span><span class='op'>::</span><span class='const'>Digest</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>sha256</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='comma'>,</span> <span class='ivar'>@config</span><span class='period'>.</span><span class='id identifier rubyid_secret'>secret</span><span class='comma'>,</span> <span class='id identifier rubyid_message'>message</span><span class='lparen'>(</span><span class='id identifier rubyid_date'>date</span><span class='comma'>,</span> <span class='id identifier rubyid_i'>i</span><span class='rparen'>)</span><span class='rparen'>)</span></code></pre>
169
+
170
+ <p>where @config.secret represents your secret which was set in the middleware
171
+ dsl block and message represents the uncrypted message for the specific
172
+ timestamp(date) and delay(i)</p>
173
+
174
+ <h5 id="label-Therefore+you+need+following+encryption+mechanism+on+the+client+side+%28pseudocode%29%3A">Therefore you need following encryption mechanism on the client side (pseudocode):</h5>
175
+
176
+ <pre class="code ruby"><code class="ruby">encrypted_message = OpenSSL::HMAC.hexdigest(OpenSSL:Digest.new(&#39;sha256&#39;), &#39;test_secret&#39;, message)
177
+
178
+ HTTP_AUTHORIZATION = encrypted_message:&#39;test_signature&#39;</code></pre>
179
+
180
+ <h5 id="label-Time+formats">Time formats</h5>
181
+
182
+ <p>The timestamp and tolerance are in millisecond format:</p>
183
+
184
+ <p>In Ruby land this means:</p>
185
+
186
+ <pre class="code ruby"><code class="ruby"><span class='lparen'>(</span><span class='const'>Time</span><span class='period'>.</span><span class='id identifier rubyid_now'>now</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span> <span class='op'>*</span> <span class='int'>1000</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_to_i'>to_i</span></code></pre>
187
+
188
+ <p>For PHP you have to use <tt>round()</tt> and <tt>microtime()</tt> :</p>
189
+
190
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_round'>round</span><span class='lparen'>(</span><span class='id identifier rubyid_microtime'>microtime</span><span class='lparen'>(</span><span class='kw'>true</span><span class='rparen'>)</span> <span class='op'>*</span> <span class='int'>1000</span><span class='rparen'>)</span></code></pre>
191
+
192
+ <h4 id="label-Examples">Examples</h4>
193
+
194
+ <p>Examples can be found in doc/examples</p>
195
+
196
+ <h5 id="label-General+your+timestamp+should+only+contain+13+digits+and+NO+floating+part">General your timestamp should only contain 13 digits and NO floating part</h5>
197
+
198
+ <h2 id="label-Contributing">Contributing</h2>
199
+ <ol><li>
200
+ <p>Fork it ( <a
201
+ href="http://github.com/benny1992/rack-simple_auth/fork">github.com/benny1992/rack-simple_auth/fork</a>
202
+ )</p>
203
+ </li><li>
204
+ <p>Create your feature branch (`git checkout -b my-new-feature`)</p>
205
+ </li><li>
206
+ <p>Commit your changes (`git commit -am &#39;Add some feature&#39;`)</p>
207
+ </li><li>
208
+ <p>Push to the branch (`git push origin my-new-feature`)</p>
209
+ </li><li>
210
+ <p>Create new Pull Request</p>
211
+ </li></ol>
212
+ </div></div>
213
+
214
+ <div id="footer">
215
+ Generated on Wed Apr 30 09:50:21 2014 by
216
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
217
+ 0.8.7.4 (ruby-2.1.1).
218
+ </div>
219
+
220
+ </body>
221
+ </html>