pkce 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 2d2c1097b83e0da1e3fcc5cd869686f286de3db0152d8ebf13e351bc2155e325
4
+ data.tar.gz: 3583de0e97dc4b2e1f7f836148687402f4807f3801eb61481a9f824e09030b28
5
+ SHA512:
6
+ metadata.gz: 6ff848d394fad7aa5a1722fb6a5b6537d1b41fcea573e3ab732a061b2664e14396d138b028ab171334afce4c924d5b672cde5f3f9ef52ea325ea958a29f8d592
7
+ data.tar.gz: 9ecbf31eba82c3592aacb455ad3444b6dadd88b6cebedafa01472c4121622bded4fafc474c51ca2bbd62f50131ccf305c11b9c854ae444c54b756bb5e2ca53eb
checksums.yaml.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ #ϐƕ2E�r�X!gq���<iߜ�~_ga���5��Xy��D�wn �9���fc&��`�MZ~���@�@�m�~A�Y�2,1q�=���I�#,�[�����E�z��0֒��m�4 ���h��$�C:Z��,��嬴m&> �0cݛ����O[��ow� �[W�N�
2
+ ,j9Ϡ;q��\"����-�>��X��������
data/LICENSE.adoc ADDED
@@ -0,0 +1,134 @@
1
+ = Hippocratic License
2
+
3
+ Version: 2.1.0.
4
+
5
+ Purpose. The purpose of this License is for the Licensor named above to
6
+ permit the Licensee (as defined below) broad permission, if consistent
7
+ with Human Rights Laws and Human Rights Principles (as each is defined
8
+ below), to use and work with the Software (as defined below) within the
9
+ full scope of Licensor’s copyright and patent rights, if any, in the
10
+ Software, while ensuring attribution and protecting the Licensor from
11
+ liability.
12
+
13
+ Permission and Conditions. The Licensor grants permission by this
14
+ license ("License"), free of charge, to the extent of Licensor’s
15
+ rights under applicable copyright and patent law, to any person or
16
+ entity (the "Licensee") obtaining a copy of this software and
17
+ associated documentation files (the "Software"), to do everything with
18
+ the Software that would otherwise infringe (i) the Licensor’s copyright
19
+ in the Software or (ii) any patent claims to the Software that the
20
+ Licensor can license or becomes able to license, subject to all of the
21
+ following terms and conditions:
22
+
23
+ * Acceptance. This License is automatically offered to every person and
24
+ entity subject to its terms and conditions. Licensee accepts this
25
+ License and agrees to its terms and conditions by taking any action with
26
+ the Software that, absent this License, would infringe any intellectual
27
+ property right held by Licensor.
28
+ * Notice. Licensee must ensure that everyone who gets a copy of any part
29
+ of this Software from Licensee, with or without changes, also receives
30
+ the License and the above copyright notice (and if included by the
31
+ Licensor, patent, trademark and attribution notice). Licensee must cause
32
+ any modified versions of the Software to carry prominent notices stating
33
+ that Licensee changed the Software. For clarity, although Licensee is
34
+ free to create modifications of the Software and distribute only the
35
+ modified portion created by Licensee with additional or different terms,
36
+ the portion of the Software not modified must be distributed pursuant to
37
+ this License. If anyone notifies Licensee in writing that Licensee has
38
+ not complied with this Notice section, Licensee can keep this License by
39
+ taking all practical steps to comply within 30 days after the notice. If
40
+ Licensee does not do so, Licensee’s License (and all rights licensed
41
+ hereunder) shall end immediately.
42
+ * Compliance with Human Rights Principles and Human Rights Laws.
43
+ [arabic]
44
+ . Human Rights Principles.
45
+ [loweralpha]
46
+ .. Licensee is advised to consult the articles of the United Nations
47
+ Universal Declaration of Human Rights and the United Nations Global
48
+ Compact that define recognized principles of international human rights
49
+ (the "Human Rights Principles"). Licensee shall use the Software in a
50
+ manner consistent with Human Rights Principles.
51
+ .. Unless the Licensor and Licensee agree otherwise, any dispute,
52
+ controversy, or claim arising out of or relating to (i) Section 1(a)
53
+ regarding Human Rights Principles, including the breach of Section 1(a),
54
+ termination of this License for breach of the Human Rights Principles,
55
+ or invalidity of Section 1(a) or (ii) a determination of whether any Law
56
+ is consistent or in conflict with Human Rights Principles pursuant to
57
+ Section 2, below, shall be settled by arbitration in accordance with the
58
+ Hague Rules on Business and Human Rights Arbitration (the "Rules");
59
+ provided, however, that Licensee may elect not to participate in such
60
+ arbitration, in which event this License (and all rights licensed
61
+ hereunder) shall end immediately. The number of arbitrators shall be one
62
+ unless the Rules require otherwise.
63
+ +
64
+ Unless both the Licensor and Licensee agree to the contrary: (1) All
65
+ documents and information concerning the arbitration shall be public and
66
+ may be disclosed by any party; (2) The repository referred to under
67
+ Article 43 of the Rules shall make available to the public in a timely
68
+ manner all documents concerning the arbitration which are communicated
69
+ to it, including all submissions of the parties, all evidence admitted
70
+ into the record of the proceedings, all transcripts or other recordings
71
+ of hearings and all orders, decisions and awards of the arbitral
72
+ tribunal, subject only to the arbitral tribunal’s powers to take such
73
+ measures as may be necessary to safeguard the integrity of the arbitral
74
+ process pursuant to Articles 18, 33, 41 and 42 of the Rules; and (3)
75
+ Article 26(6) of the Rules shall not apply.
76
+ . Human Rights Laws. The Software shall not be used by any person or
77
+ entity for any systems, activities, or other uses that violate any Human
78
+ Rights Laws. "Human Rights Laws" means any applicable laws,
79
+ regulations, or rules (collectively, "Laws") that protect human,
80
+ civil, labor, privacy, political, environmental, security, economic, due
81
+ process, or similar rights; provided, however, that such Laws are
82
+ consistent and not in conflict with Human Rights Principles (a dispute
83
+ over the consistency or a conflict between Laws and Human Rights
84
+ Principles shall be determined by arbitration as stated above). Where
85
+ the Human Rights Laws of more than one jurisdiction are applicable or in
86
+ conflict with respect to the use of the Software, the Human Rights Laws
87
+ that are most protective of the individuals or groups harmed shall
88
+ apply.
89
+ . Indemnity. Licensee shall hold harmless and indemnify Licensor (and
90
+ any other contributor) against all losses, damages, liabilities,
91
+ deficiencies, claims, actions, judgments, settlements, interest, awards,
92
+ penalties, fines, costs, or expenses of whatever kind, including
93
+ Licensor’s reasonable attorneys’ fees, arising out of or relating to
94
+ Licensee’s use of the Software in violation of Human Rights Laws or
95
+ Human Rights Principles.
96
+ * Failure to Comply. Any failure of Licensee to act according to the
97
+ terms and conditions of this License is both a breach of the License and
98
+ an infringement of the intellectual property rights of the Licensor
99
+ (subject to exceptions under Laws, e.g., fair use). In the event of a
100
+ breach or infringement, the terms and conditions of this License may be
101
+ enforced by Licensor under the Laws of any jurisdiction to which
102
+ Licensee is subject. Licensee also agrees that the Licensor may enforce
103
+ the terms and conditions of this License against Licensee through
104
+ specific performance (or similar remedy under Laws) to the extent
105
+ permitted by Laws. For clarity, except in the event of a breach of this
106
+ License, infringement, or as otherwise stated in this License, Licensor
107
+ may not terminate this License with Licensee.
108
+ * Enforceability and Interpretation. If any term or provision of this
109
+ License is determined to be invalid, illegal, or unenforceable by a
110
+ court of competent jurisdiction, then such invalidity, illegality, or
111
+ unenforceability shall not affect any other term or provision of this
112
+ License or invalidate or render unenforceable such term or provision in
113
+ any other jurisdiction; provided, however, subject to a court
114
+ modification pursuant to the immediately following sentence, if any term
115
+ or provision of this License pertaining to Human Rights Laws or Human
116
+ Rights Principles is deemed invalid, illegal, or unenforceable against
117
+ Licensee by a court of competent jurisdiction, all rights in the
118
+ Software granted to Licensee shall be deemed null and void as between
119
+ Licensor and Licensee. Upon a determination that any term or provision
120
+ is invalid, illegal, or unenforceable, to the extent permitted by Laws,
121
+ the court may modify this License to affect the original purpose that
122
+ the Software be used in compliance with Human Rights Principles and
123
+ Human Rights Laws as closely as possible. The language in this License
124
+ shall be interpreted as to its fair meaning and not strictly for or
125
+ against any party.
126
+ * Disclaimer. TO THE FULL EXTENT ALLOWED BY LAW, THIS SOFTWARE COMES
127
+ "AS IS," WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED, AND LICENSOR AND
128
+ ANY OTHER CONTRIBUTOR SHALL NOT BE LIABLE TO ANYONE FOR ANY DAMAGES OR
129
+ OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE
130
+ OR THIS LICENSE, UNDER ANY KIND OF LEGAL CLAIM.
131
+
132
+ This Hippocratic License is an link:https://ethicalsource.dev[Ethical Source license] and is offered
133
+ for use by licensors and licensees at their own risk, on an "AS IS" basis, and with no warranties
134
+ express or implied, to the maximum extent permitted by Laws.
data/README.adoc ADDED
@@ -0,0 +1,123 @@
1
+ :rfc_link: link:https://datatracker.ietf.org/doc/html/rfc7636[RFC 7636]
2
+
3
+ :toc: macro
4
+ :toclevels: 5
5
+ :figure-caption!:
6
+
7
+ = Proof Key for Code Exchange (PKCE)
8
+
9
+ PKCE ({rfc_link}) is an authorization code flow extension to link:https://oauth.net[OAuth] which is necessary for mobile authentication but works well for web flows because the added security is transparent to the end user. Specifically, PKCE prevents the following types of attacks:
10
+
11
+ * Authorization code interception
12
+ * Authorization code injection
13
+
14
+ toc::[]
15
+
16
+ == Features
17
+
18
+ - Implements the {rfc_link} specification.
19
+ - Provides a simple object API for obtaining a challenge and verify code.
20
+ - Provides max length security by default.
21
+ - Answers a monad result.
22
+
23
+ == Requirements
24
+
25
+ . link:https://www.ruby-lang.org[Ruby].
26
+ . link:https://www.oauth.com[OAuth].
27
+
28
+ == Setup
29
+
30
+ To set up the project, run:
31
+
32
+ [source,bash]
33
+ ----
34
+ bin/setup
35
+ ----
36
+
37
+ == Usage
38
+
39
+ The object API is simple to work with as you only need to interact with the `PKCE` constant. Example:
40
+
41
+ [source,ruby]
42
+ ----
43
+ code = PKCE.call.success
44
+ code.challenge # e2tGChTfGON-C55i0yu13-urIgDFuMCmo73F7TZmoiw
45
+ code.verify # hYnx2WTJo7Bgu1-GqPUIYtRkb2W7pRBawkmdDi3omPdramb27Fp4rps_w6ozns-gbVCKFC2-Kno4P_b1H3FuxnlYIOd9Bo5yoTXq_xEHDJaB_fOfn2NaiCtcWQ8Bs91I
46
+ ----
47
+
48
+ You can also pass in a custom length (default is maximum):
49
+
50
+ [source,ruby]
51
+ ----
52
+ code = PKCE.call(length: 35).success
53
+ code.challenge # R1b1Ka3jmrLKvQ7xW5QmP5MsCSEWtdoA2lo3r-SZDfg
54
+ code.verify # ucKkqwoMzc9cyPcSGMbuVf3ivr4sep2mq15hGN9sVzl4X7g
55
+ ----
56
+
57
+ In case of a failure, you'll get a proper error message:
58
+
59
+ [source,ruby]
60
+ ----
61
+ PKCE.call(length: 100).failure # Invalid PKCE verifier length: 100. Must be between 32..96.
62
+ ----
63
+
64
+ Due to the fact that PKCE answers back a link:https://dry-rb.org/gems/dry-monads[monad], you have all of the power of link:https://www.alchemists.io/talks/ruby_pattern_matching[pattern matching] at your fingertips as well:
65
+
66
+ [source,ruby]
67
+ ----
68
+ include Dry::Monads[:result]
69
+
70
+ case PKCE.call
71
+ in Success(code) then puts code.inspect
72
+ in Failure(message) then puts message
73
+ end
74
+ ----
75
+
76
+ Finally, since the code answered back is a link:https://www.alchemists.io/articles/ruby_structs[Struct], you have a value object -- which is frozen -- that you can easily test and interact with:
77
+
78
+ [source,ruby]
79
+ ----
80
+ PKCE.call.success
81
+ # #<struct PKCE::Code challenge="dTiwjdltI-SBR1wHTEWa8zQs2kegLoIxJb2fb8emno0", verify="p4uH9lxdDMLmYLaLtYV0QJMi-o0FTQT29CJWYcdRsK0xJVsaFiQ981W5nSWDsWJgA-LS5hwKHEPcOAmVgOELNpolPhi3tcelBX9Y-z_hHUOq24DAAZOe0DU6VBb6zHCZ">
82
+ ----
83
+
84
+ == Architecture
85
+
86
+ The following documents the workflow used to process and build authorization codes.
87
+
88
+ image::https://www.alchemists.io/images/projects/pkce/doc/sequence_diagram.svg[Sequence Diagram]
89
+
90
+ == Development
91
+
92
+ You can also use the IRB console for direct access to all objects:
93
+
94
+ [source,bash]
95
+ ----
96
+ bin/console
97
+ ----
98
+
99
+ == Tests
100
+
101
+ To test, run:
102
+
103
+ [source,bash]
104
+ ----
105
+ bundle exec rake
106
+ ----
107
+
108
+ == link:https://www.alchemists.io/policies/license[License]
109
+
110
+ == link:https://www.alchemists.io/policies/security[Security]
111
+
112
+ == link:https://www.alchemists.io/policies/code_of_conduct[Code of Conduct]
113
+
114
+ == link:https://www.alchemists.io/policies/contributions[Contributions]
115
+
116
+ == link:https://www.alchemists.io/projects/pkce/versions[Versions]
117
+
118
+ == link:https://www.alchemists.io/community[Community]
119
+
120
+ == Credits
121
+
122
+ * Built with link:https://www.alchemists.io/projects/gemsmith[Gemsmith].
123
+ * Engineered by link:https://www.alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann].
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "base64"
4
+ require "digest"
5
+
6
+ module PKCE
7
+ # Handles Proof Key for Code Exchange (PKCE) challenge.
8
+ class Challenger
9
+ def initialize hasher: Digest::SHA256, encoder: Base64
10
+ @hasher = hasher
11
+ @encoder = encoder
12
+ end
13
+
14
+ def call(code) = encoder.urlsafe_encode64 hasher.digest(code), padding: false
15
+
16
+ private
17
+
18
+ attr_reader :hasher, :encoder
19
+ end
20
+ end
data/lib/pkce/code.rb ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PKCE
4
+ # Encapsulates the challenge and verify code.
5
+ Code = Struct.new :challenge, :verify, keyword_init: true do
6
+ def initialize *arguments
7
+ super
8
+ freeze
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PKCE
4
+ # Encodes Proof Key for Code Exchange (PKCE) codes for authorization.
5
+ class Encoder
6
+ def initialize code: Code, verifier: Verifier.new, challenger: Challenger.new
7
+ @code = code
8
+ @verifier = verifier
9
+ @challenger = challenger
10
+ end
11
+
12
+ def call length: Verifier::MAX
13
+ verifier.call(length:).fmap { |value| code[challenge: challenger.call(value), verify: value] }
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :code, :verifier, :challenger, :logger
19
+ end
20
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securerandom"
4
+ require "dry/monads"
5
+
6
+ module PKCE
7
+ # Handles Proof Key for Code Exchange (PKCE) verification.
8
+ class Verifier
9
+ include Dry::Monads[:result]
10
+
11
+ RANGE = 32..96
12
+ MAX = RANGE.max
13
+
14
+ def initialize range: RANGE, randomizer: SecureRandom
15
+ @range = range
16
+ @randomizer = randomizer
17
+ end
18
+
19
+ def call length: MAX
20
+ if range.cover? length
21
+ Success randomizer.urlsafe_base64(length)
22
+ else
23
+ Failure "Invalid PKCE verifier length: #{length}. Must be between #{range.inspect}."
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ attr_reader :range, :randomizer
30
+ end
31
+ end
data/lib/pkce.rb ADDED
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pkce/challenger"
4
+ require "pkce/verifier"
5
+ require "pkce/code"
6
+ require "pkce/encoder"
7
+
8
+ # Main namespace.
9
+ module PKCE
10
+ def self.call(...) = Encoder.new.call(...)
11
+ end
data/pkce.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "pkce"
5
+ spec.version = "0.0.0"
6
+ spec.authors = ["Brooke Kuhlmann"]
7
+ spec.email = ["brooke@alchemists.io"]
8
+ spec.homepage = "https://www.alchemists.io/projects/pkce"
9
+ spec.summary = "Encodes Proof Key for Code Exchange (PKCE) for OAuth."
10
+ spec.license = "Hippocratic-2.1"
11
+
12
+ spec.metadata = {
13
+ "bug_tracker_uri" => "https://github.com/bkuhlmann/pkce/issues",
14
+ "changelog_uri" => "https://www.alchemists.io/projects/pkce/versions",
15
+ "documentation_uri" => "https://www.alchemists.io/projects/pkce",
16
+ "funding_uri" => "https://github.com/sponsors/bkuhlmann",
17
+ "label" => "Pkce",
18
+ "rubygems_mfa_required" => "true",
19
+ "source_code_uri" => "https://github.com/bkuhlmann/pkce"
20
+ }
21
+
22
+ spec.signing_key = Gem.default_key_path
23
+ spec.cert_chain = [Gem.default_cert_path]
24
+
25
+ spec.required_ruby_version = "~> 3.1"
26
+ spec.add_dependency "dry-monads", "~> 1.4"
27
+
28
+ spec.extra_rdoc_files = Dir["README*", "LICENSE*"]
29
+ spec.files = Dir["*.gemspec", "lib/**/*"]
30
+ end
data.tar.gz.sig ADDED
@@ -0,0 +1 @@
1
+ �;�5����Sq���Yc��0�ȷ8��\.���"?��,v.E�M��)��¯�$��6�9٦��Ш �� y|��b}�#,� ��h��`�dø�_�6� �P.$��v˧�v?:�|[ �;Qԛ~_d˷yu�-������zB.s�S�(��A 1*���گ9��qɒF�t}���$����lϩ&f�v���=P��x� �NR���4���ߑ�GJj��"���$�P��U���LB��PG �N����_���{~d6
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pkce
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brooke Kuhlmann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIC/jCCAeagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
+ a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMjAzMTkxNzI0MzJaFw0yMzAzMTkx
15
+ NzI0MzJaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
16
+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6l1qpXTiomH1RfMRloyw7MiE
17
+ xyVx/x8Yc3EupdH7uhNaTXQGyORN6aOY//1QXXMHIZ9tW74nZLhesWMSUMYy0XhB
18
+ brs+KkurHnc9FnEJAbG7ebGvl/ncqZt72nQvaxpDxvuCBHgJAz+8i5wl6FhLw+oT
19
+ 9z0A8KcGhz67SdcoQiD7qiCjL/2NTeWHOzkpPrdGlt088+VerEEGf5I13QCvaftP
20
+ D5vkU0YlAm1r98BymuJlcQ1qdkVEI1d48ph4kcS0S0nv1RiuyVb6TCAR3Nu3VaVq
21
+ 3fPzZKJLZBx67UvXdbdicWPiUR75elI4PXpLIic3xytaF52ZJYyKZCNZJhNwfQID
22
+ AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU0nzow9vc
23
+ 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAJbbNyWzFjqUNVPPCUCo
24
+ IMrhDa9xf1xkORXNYYbmXgoxRy/KyNbUr+jgEEoWJAm9GXlcqxxWAUI6pK/i4/Qi
25
+ X6rPFEFmeObDOHNvuqy8Hd6AYsu+kP94U/KJhe9wnWGMmGoNKJNU3EkW3jM/osSl
26
+ +JRxiH5t4WtnDiVyoYl5nYC02rYdjJkG6VMxDymXTqn7u6HhYgZkGujq1UPar8x2
27
+ hNIWJblDKKSu7hA2d6+kUthuYo13o1sg1Da/AEDg0hoZSUvhqDEF5Hy232qb3pDt
28
+ CxDe2+VuChj4I1nvIHdu+E6XoEVlanUPKmSg6nddhkKn2gC45Kyzh6FZqnzH/CRp
29
+ RFE=
30
+ -----END CERTIFICATE-----
31
+ date: 2022-06-25 00:00:00.000000000 Z
32
+ dependencies:
33
+ - !ruby/object:Gem::Dependency
34
+ name: dry-monads
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.4'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.4'
47
+ description:
48
+ email:
49
+ - brooke@alchemists.io
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files:
53
+ - README.adoc
54
+ - LICENSE.adoc
55
+ files:
56
+ - LICENSE.adoc
57
+ - README.adoc
58
+ - lib/pkce.rb
59
+ - lib/pkce/challenger.rb
60
+ - lib/pkce/code.rb
61
+ - lib/pkce/encoder.rb
62
+ - lib/pkce/verifier.rb
63
+ - pkce.gemspec
64
+ homepage: https://www.alchemists.io/projects/pkce
65
+ licenses:
66
+ - Hippocratic-2.1
67
+ metadata:
68
+ bug_tracker_uri: https://github.com/bkuhlmann/pkce/issues
69
+ changelog_uri: https://www.alchemists.io/projects/pkce/versions
70
+ documentation_uri: https://www.alchemists.io/projects/pkce
71
+ funding_uri: https://github.com/sponsors/bkuhlmann
72
+ label: Pkce
73
+ rubygems_mfa_required: 'true'
74
+ source_code_uri: https://github.com/bkuhlmann/pkce
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '3.1'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubygems_version: 3.3.16
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Encodes Proof Key for Code Exchange (PKCE) for OAuth.
94
+ test_files: []
metadata.gz.sig ADDED
@@ -0,0 +1 @@
1
+ a�lV�����7N�NH$��,�<j7�Eh��j��,w`q6?��"d��G�D�wV�ȼ���E��r�`���BS�4����+��Ox2�L���K}��L�z�O:1����c8�jx�=}'��f%CN�r��!3i�����a�b�(ƅ�Ȋ����ō�D���S8�H��������f��� T����<��l�D���Q#~T\߿Ľ"��H}��Q������"Ls��&ESS~q\��U�ߏ����&���K