|
1 | 1 | #
|
2 | 2 | # JSON Web Token implementation
|
3 | 3 | #
|
4 |
| -# Minimum implementation based on this spec: |
5 |
| -# http://self-issued.info/docs/draft-jones-json-web-token-01.html |
| 4 | +# Should be up to date with the latest spec: |
| 5 | +# http://self-issued.info/docs/draft-jones-json-web-token-06.html |
6 | 6 |
|
7 | 7 | require "base64"
|
8 | 8 | require "openssl"
|
@@ -43,29 +43,34 @@ def self.base64url_encode(str)
|
43 | 43 | end
|
44 | 44 |
|
45 | 45 | def self.encode(payload, key, algorithm='HS256')
|
| 46 | + algorithm ||= "none" |
46 | 47 | segments = []
|
47 | 48 | header = {"typ" => "JWT", "alg" => algorithm}
|
48 | 49 | segments << base64url_encode(header.to_json)
|
49 | 50 | segments << base64url_encode(payload.to_json)
|
50 | 51 | signing_input = segments.join('.')
|
51 |
| - signature = sign(algorithm, signing_input, key) |
52 |
| - segments << base64url_encode(signature) |
| 52 | + if algorithm != "none" |
| 53 | + signature = sign(algorithm, signing_input, key) |
| 54 | + segments << base64url_encode(signature) |
| 55 | + else |
| 56 | + segments << "" |
| 57 | + end |
53 | 58 | segments.join('.')
|
54 | 59 | end
|
55 | 60 |
|
56 | 61 | def self.decode(jwt, key=nil, verify=true)
|
57 | 62 | segments = jwt.split('.')
|
58 |
| - raise JWT::DecodeError.new("Not enough or too many segments") unless segments.length == 3 |
| 63 | + raise JWT::DecodeError.new("Not enough or too many segments") unless [2,3].include? segments.length |
59 | 64 | header_segment, payload_segment, crypto_segment = segments
|
60 | 65 | signing_input = [header_segment, payload_segment].join('.')
|
61 | 66 | begin
|
62 | 67 | header = JSON.parse(base64url_decode(header_segment))
|
63 | 68 | payload = JSON.parse(base64url_decode(payload_segment))
|
64 |
| - signature = base64url_decode(crypto_segment) |
| 69 | + signature = base64url_decode(crypto_segment) if verify |
65 | 70 | rescue JSON::ParserError
|
66 | 71 | raise JWT::DecodeError.new("Invalid segment encoding")
|
67 | 72 | end
|
68 |
| - if verify |
| 73 | + if verify == true |
69 | 74 | algo = header['alg']
|
70 | 75 |
|
71 | 76 | if ["HS256", "HS384", "HS512"].include?(algo)
|
|
0 commit comments