stripe_event 1.7.0 → 1.8.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +15 -3
- data/app/controllers/stripe_event/webhook_controller.rb +14 -1
- data/lib/stripe_event.rb +1 -1
- data/lib/stripe_event/version.rb +1 -1
- data/spec/controllers/webhook_controller_spec.rb +40 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9463bf4cf0ff40f3d50526e98d6167dc77dbbd1
|
4
|
+
data.tar.gz: 5822f4e55cbc6ca4bc6f0870ac76055ff858cfbf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48ece33350c3b997dfc8008bb406e702f53e4c4f343d1789edc4e69b2d491b14652a6016604481a0682a1c639b71885de7128e9d8635481f9dde636359dc9711
|
7
|
+
data.tar.gz: 4cc3051021fbfb1cc71c3feb0116a40d79739f5e2ddeb3646edbce592d343af60430d3bfe5deae60fcd026b298187a545618827dd9ec25c0bf18a4673ded85d4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
### 1.7.0 (July 5, 2017)
|
2
|
+
|
3
|
+
* Support stripe v3 gem as a dependency (#87)
|
4
|
+
|
5
|
+
### 1.6.0 (February 27, 2017)
|
6
|
+
|
7
|
+
* Support stripe v2 gem as a dependency (#82, b3cee03)
|
8
|
+
|
9
|
+
### 1.5.1 (September 20, 2016)
|
10
|
+
|
11
|
+
* Better Rails 5 support. Prefer `before_action` over `before_filter`. (#69, Thanks @mcolyer)
|
12
|
+
|
1
13
|
### 1.5.0 (February 25, 2015)
|
2
14
|
* Added [replay attack protection](https://github.com/integrallis/stripe_event#securing-your-webhook-endpoint) on webhooks. See `StripeEvent.authentication_secret`. Thanks @brentdax for both the initial discussion and the implementation! #53, #55
|
3
15
|
* Dropped official support for Rails 3.1 and Rails 4.0
|
data/README.md
CHANGED
@@ -99,13 +99,23 @@ To prevent this, StripeEvent supports using HTTP Basic authentication on your we
|
|
99
99
|
|
100
100
|
This is only truly secure if your webhook endpoint is accessed over SSL, which Stripe strongly recommends anyway.
|
101
101
|
|
102
|
+
## Authenticating webhooks
|
103
|
+
|
104
|
+
Stripe will cryptographically sign webhook payloads with a signature that is included in a special header sent with the request. Verifying this signature lets your application properly authenticate the request originated from Stripe. To leverage this feature, please set the `signing_secret` configuration value:
|
105
|
+
|
106
|
+
```
|
107
|
+
StripeEvent.signing_secret = Rails.application.secrets.stripe_signing_secret
|
108
|
+
```
|
109
|
+
|
110
|
+
Please refer to Stripe's documentation for more details: https://stripe.com/docs/webhooks#signatures
|
111
|
+
|
102
112
|
## Configuration
|
103
113
|
|
104
|
-
If you have built an application that has multiple Stripe accounts--say, each of your customers has their own--you may want to define your own way of retrieving events from Stripe (e.g. perhaps you want to use the [
|
114
|
+
If you have built an application that has multiple Stripe accounts--say, each of your customers has their own--you may want to define your own way of retrieving events from Stripe (e.g. perhaps you want to use the [account parameter](https://stripe.com/docs/connect/webhooks) from the top level to detect the customer for the event, then grab their specific API key). You can do this:
|
105
115
|
|
106
116
|
```ruby
|
107
117
|
StripeEvent.event_retriever = lambda do |params|
|
108
|
-
api_key = Account.find_by!(stripe_user_id: params[:
|
118
|
+
api_key = Account.find_by!(stripe_user_id: params[:account]).api_key
|
109
119
|
Stripe::Event.retrieve(params[:id], api_key)
|
110
120
|
end
|
111
121
|
```
|
@@ -113,7 +123,7 @@ end
|
|
113
123
|
```ruby
|
114
124
|
class EventRetriever
|
115
125
|
def call(params)
|
116
|
-
api_key = retrieve_api_key(params[:
|
126
|
+
api_key = retrieve_api_key(params[:account])
|
117
127
|
Stripe::Event.retrieve(params[:id], api_key)
|
118
128
|
end
|
119
129
|
|
@@ -127,6 +137,8 @@ end
|
|
127
137
|
StripeEvent.event_retriever = EventRetriever.new
|
128
138
|
```
|
129
139
|
|
140
|
+
*Note: Older versions of Stripe used `user_id` to reference the Connect account.*
|
141
|
+
|
130
142
|
If you'd like to ignore particular webhook events (perhaps to ignore test webhooks in production, or to ignore webhooks for a non-paying customer), you can do so by returning `nil` in you custom `event_retriever`. For example:
|
131
143
|
|
132
144
|
```ruby
|
@@ -2,8 +2,10 @@ module StripeEvent
|
|
2
2
|
class WebhookController < ActionController::Base
|
3
3
|
if respond_to?(:before_action)
|
4
4
|
before_action :request_authentication
|
5
|
+
before_action :verify_signature
|
5
6
|
else
|
6
7
|
before_filter :request_authentication
|
8
|
+
before_filter :verify_signature
|
7
9
|
end
|
8
10
|
|
9
11
|
def event
|
@@ -24,9 +26,20 @@ module StripeEvent
|
|
24
26
|
def request_authentication
|
25
27
|
if StripeEvent.authentication_secret
|
26
28
|
authenticate_or_request_with_http_basic do |username, password|
|
27
|
-
password
|
29
|
+
ActiveSupport::SecurityUtils.variable_size_secure_compare password, StripeEvent.authentication_secret
|
28
30
|
end
|
29
31
|
end
|
30
32
|
end
|
33
|
+
|
34
|
+
def verify_signature
|
35
|
+
if StripeEvent.signing_secret
|
36
|
+
payload = request.body.read
|
37
|
+
signature = request.headers['Stripe-Signature']
|
38
|
+
|
39
|
+
Stripe::Webhook::Signature.verify_header payload, signature, StripeEvent.signing_secret
|
40
|
+
end
|
41
|
+
rescue Stripe::SignatureVerificationError
|
42
|
+
head :bad_request
|
43
|
+
end
|
31
44
|
end
|
32
45
|
end
|
data/lib/stripe_event.rb
CHANGED
@@ -4,7 +4,7 @@ require "stripe_event/engine" if defined?(Rails)
|
|
4
4
|
|
5
5
|
module StripeEvent
|
6
6
|
class << self
|
7
|
-
attr_accessor :adapter, :backend, :event_retriever, :namespace, :authentication_secret
|
7
|
+
attr_accessor :adapter, :backend, :event_retriever, :namespace, :authentication_secret, :signing_secret
|
8
8
|
|
9
9
|
def configure(&block)
|
10
10
|
raise ArgumentError, "must provide a block" unless block_given?
|
data/lib/stripe_event/version.rb
CHANGED
@@ -84,4 +84,44 @@ describe StripeEvent::WebhookController do
|
|
84
84
|
expect(response.code).to eq '200'
|
85
85
|
end
|
86
86
|
end
|
87
|
+
|
88
|
+
context "with a signing secret" do
|
89
|
+
def webhook_with_signature(signature, params)
|
90
|
+
request.env['HTTP_STRIPE_SIGNATURE'] = signature
|
91
|
+
webhook params
|
92
|
+
end
|
93
|
+
|
94
|
+
def generate_signature(secret)
|
95
|
+
payload = 'id=evt_charge_succeeded'
|
96
|
+
timestamp = Time.now.to_i
|
97
|
+
signature = Stripe::Webhook::Signature.send(:compute_signature, "#{timestamp}.#{payload}", secret)
|
98
|
+
|
99
|
+
"t=#{timestamp},v1=#{signature}"
|
100
|
+
end
|
101
|
+
|
102
|
+
let(:shared_secret) { 'secret' }
|
103
|
+
|
104
|
+
before(:each) { StripeEvent.signing_secret = shared_secret }
|
105
|
+
after(:each) { StripeEvent.signing_secret = nil }
|
106
|
+
|
107
|
+
it "rejects missing signature" do
|
108
|
+
webhook id: 'evt_charge_succeeded'
|
109
|
+
|
110
|
+
expect(response.code).to eq '400'
|
111
|
+
end
|
112
|
+
|
113
|
+
it "rejects invalid signature" do
|
114
|
+
webhook_with_signature "invalid signature", id: 'evt_charge_succeeded'
|
115
|
+
|
116
|
+
expect(response.code).to eq '400'
|
117
|
+
end
|
118
|
+
|
119
|
+
it "accepts valid signature" do
|
120
|
+
stub_event 'evt_charge_succeeded'
|
121
|
+
|
122
|
+
webhook_with_signature generate_signature(shared_secret), id: 'evt_charge_succeeded'
|
123
|
+
|
124
|
+
expect(response.code).to eq '200'
|
125
|
+
end
|
126
|
+
end
|
87
127
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stripe_event
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Whalen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -210,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
210
210
|
version: '0'
|
211
211
|
requirements: []
|
212
212
|
rubyforge_project:
|
213
|
-
rubygems_version: 2.
|
213
|
+
rubygems_version: 2.6.11
|
214
214
|
signing_key:
|
215
215
|
specification_version: 4
|
216
216
|
summary: Stripe webhook integration for Rails applications.
|