restforce 4.0.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile +1 -0
- data/README.md +25 -10
- data/lib/restforce.rb +1 -0
- data/lib/restforce/concerns/authentication.rb +10 -0
- data/lib/restforce/concerns/base.rb +2 -0
- data/lib/restforce/config.rb +3 -0
- data/lib/restforce/middleware/authentication.rb +3 -2
- data/lib/restforce/middleware/authentication/jwt_bearer.rb +38 -0
- data/lib/restforce/version.rb +1 -1
- data/restforce.gemspec +2 -1
- data/spec/fixtures/test_private.key +27 -0
- data/spec/unit/concerns/authentication_spec.rb +35 -0
- data/spec/unit/middleware/authentication/jwt_bearer_spec.rb +62 -0
- metadata +23 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4d4058f81fe1d435976494baa2c81caa57515d21f1ffcb0784286d5a608af39
|
4
|
+
data.tar.gz: ddd80cd062c00f2c9d249e63e2cec5103da55a225c42d443e4370c2d234fae36
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b37491f67c8f1494aa849b6118c6b5d0bcfae35ebc5f8e313c68d1989fd4fda486ff661a8dfb74181526958b6baa8cff2b477b7297bdeb9bf98a6e44becfb1f
|
7
|
+
data.tar.gz: c046776763a2d2bc13890f6c64241052d25d8e1ded812770ef99aa7df407662065f9bbc349c94d902a66cf71d400770b63dd964a355ea9d2cd57cffe3500156f
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## 4.1.0 (Oct 20, 2019)
|
2
|
+
|
3
|
+
* Add support for JWT authentication (@nathanKramer, @tagCincy)
|
4
|
+
|
1
5
|
## 4.0.0 (Oct 9, 2019)
|
2
6
|
|
3
7
|
* __Deprecate support for Ruby 2.3__, since [Ruby 2.3 reached its end-of-life](https://www.ruby-lang.org/en/news/2019/03/31/support-of-ruby-2-3-has-ended/) in March 2019. (This is the only breaking change included in this version.)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -25,7 +25,7 @@ Features include:
|
|
25
25
|
|
26
26
|
Add this line to your application's Gemfile:
|
27
27
|
|
28
|
-
gem 'restforce', '~> 4.
|
28
|
+
gem 'restforce', '~> 4.1.0'
|
29
29
|
|
30
30
|
And then execute:
|
31
31
|
|
@@ -111,6 +111,21 @@ client = Restforce.new(username: 'foo',
|
|
111
111
|
api_version: '41.0')
|
112
112
|
```
|
113
113
|
|
114
|
+
#### JWT Bearer Token
|
115
|
+
|
116
|
+
If you prefer to use a [JWT Bearer Token](https://developer.salesforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com#Obtaining_an_Access_Token_using_a_JWT_Bearer_Token) to authenticate:
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
client = Restforce.new(username: 'foo',
|
120
|
+
client_id: 'client_id',
|
121
|
+
instance_url: 'instance_url',
|
122
|
+
jwt_key: 'certificate_private_key',
|
123
|
+
api_version: '38.0')
|
124
|
+
```
|
125
|
+
|
126
|
+
The `jwt_key` option is the private key of the certificate uploaded to your Connected App in Salesforce.
|
127
|
+
Choose "use digital signatures" in the Connected App configuration screen to upload your certificate.
|
128
|
+
|
114
129
|
You can also set the username, password, security token, client ID, client
|
115
130
|
secret and API version in environment variables:
|
116
131
|
|
@@ -473,11 +488,11 @@ document = client.query('select Id, Name, Body from Document').first
|
|
473
488
|
File.open(document.Name, 'wb') { |f| f.write(document.Body) }
|
474
489
|
```
|
475
490
|
|
476
|
-
**Note:** The example above is only applicable if your SOQL query returns a single Document record. If more than one record is returned,
|
491
|
+
**Note:** The example above is only applicable if your SOQL query returns a single Document record. If more than one record is returned,
|
477
492
|
the Body field contains an URL to retrieve the BLOB content for the first 2000 records returned. Subsequent records contain the BLOB content
|
478
|
-
in the Body field. This is confusing and hard to debug. See notes in [Issue #301](https://github.com/restforce/restforce/issues/301#issuecomment-298972959) explaining this detail.
|
479
|
-
**Executive Summary:** Don't retrieve the Body field in a SOQL query; instead, use the BLOB retrieval URL documented
|
480
|
-
in [SObject BLOB Retrieve](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_sobject_blob_retrieve.htm)
|
493
|
+
in the Body field. This is confusing and hard to debug. See notes in [Issue #301](https://github.com/restforce/restforce/issues/301#issuecomment-298972959) explaining this detail.
|
494
|
+
**Executive Summary:** Don't retrieve the Body field in a SOQL query; instead, use the BLOB retrieval URL documented
|
495
|
+
in [SObject BLOB Retrieve](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_sobject_blob_retrieve.htm)
|
481
496
|
|
482
497
|
* * *
|
483
498
|
|
@@ -574,14 +589,14 @@ There are two magic values for the replay ID accepted by Salesforce:
|
|
574
589
|
|
575
590
|
**Warning**: Only use a replay ID of a event from the last 24 hours otherwise
|
576
591
|
Salesforce will not send anything, including newer events. If in doubt, use one
|
577
|
-
of the two magic replay IDs mentioned above.
|
592
|
+
of the two magic replay IDs mentioned above.
|
578
593
|
|
579
|
-
You might want to store the replay ID in some sort of datastore so you can
|
594
|
+
You might want to store the replay ID in some sort of datastore so you can
|
580
595
|
access it, for example between application restarts. In that case, there is the
|
581
596
|
option of passing a custom replay handler which responds to `[]` and `[]=`.
|
582
597
|
|
583
598
|
Below is a sample replay handler that stores the replay ID for each channel in
|
584
|
-
memory using a Hash, stores a timestamp and has some rudimentary logic that
|
599
|
+
memory using a Hash, stores a timestamp and has some rudimentary logic that
|
585
600
|
will use one of the magic IDs depending on the value of the timestamp:
|
586
601
|
|
587
602
|
```ruby
|
@@ -637,9 +652,9 @@ EM.run {
|
|
637
652
|
puts message.inspect
|
638
653
|
end
|
639
654
|
}
|
640
|
-
```
|
655
|
+
```
|
641
656
|
|
642
|
-
_See also_:
|
657
|
+
_See also_:
|
643
658
|
|
644
659
|
* [Force.com Streaming API docs](http://www.salesforce.com/us/developer/docs/api_streaming/index.htm)
|
645
660
|
* [Message Durability docs](https://developer.salesforce.com/docs/atlas.en-us.api_streaming.meta/api_streaming/using_streaming_api_durability.htm)
|
data/lib/restforce.rb
CHANGED
@@ -19,6 +19,8 @@ module Restforce
|
|
19
19
|
Restforce::Middleware::Authentication::Password
|
20
20
|
elsif oauth_refresh?
|
21
21
|
Restforce::Middleware::Authentication::Token
|
22
|
+
elsif jwt?
|
23
|
+
Restforce::Middleware::Authentication::JWTBearer
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
@@ -38,6 +40,14 @@ module Restforce
|
|
38
40
|
options[:client_id] &&
|
39
41
|
options[:client_secret]
|
40
42
|
end
|
43
|
+
|
44
|
+
# Internal: Returns true if jwt bearer token flow should be used for
|
45
|
+
# authentication.
|
46
|
+
def jwt?
|
47
|
+
options[:jwt_key] &&
|
48
|
+
options[:username] &&
|
49
|
+
options[:client_id]
|
50
|
+
end
|
41
51
|
end
|
42
52
|
end
|
43
53
|
end
|
@@ -28,6 +28,8 @@ module Restforce
|
|
28
28
|
# password and oauth authentication
|
29
29
|
# :client_secret - The oauth client secret to use.
|
30
30
|
#
|
31
|
+
# :jwt_key - The private key for JWT authentication
|
32
|
+
#
|
31
33
|
# :host - The String hostname to use during
|
32
34
|
# authentication requests
|
33
35
|
# (default: 'login.salesforce.com').
|
data/lib/restforce/config.rb
CHANGED
@@ -108,6 +108,9 @@ module Restforce
|
|
108
108
|
# The OAuth client secret
|
109
109
|
option :client_secret, default: lambda { ENV['SALESFORCE_CLIENT_SECRET'] }
|
110
110
|
|
111
|
+
# The private key for JWT authentication
|
112
|
+
option :jwt_key
|
113
|
+
|
111
114
|
# Set this to true if you're authenticating with a Sandbox instance.
|
112
115
|
# Defaults to false.
|
113
116
|
option :host, default: lambda { ENV['SALESFORCE_HOST'] || 'login.salesforce.com' }
|
@@ -6,8 +6,9 @@ module Restforce
|
|
6
6
|
# will attempt to either reauthenticate (username and password) or refresh
|
7
7
|
# the oauth access token (if a refresh token is present).
|
8
8
|
class Middleware::Authentication < Restforce::Middleware
|
9
|
-
autoload :Password,
|
10
|
-
autoload :Token,
|
9
|
+
autoload :Password, 'restforce/middleware/authentication/password'
|
10
|
+
autoload :Token, 'restforce/middleware/authentication/token'
|
11
|
+
autoload :JWTBearer, 'restforce/middleware/authentication/jwt_bearer'
|
11
12
|
|
12
13
|
# Rescue from 401's, authenticate then raise the error again so the client
|
13
14
|
# can reissue the request.
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jwt'
|
4
|
+
|
5
|
+
module Restforce
|
6
|
+
class Middleware
|
7
|
+
class Authentication
|
8
|
+
class JWTBearer < Restforce::Middleware::Authentication
|
9
|
+
def params
|
10
|
+
{
|
11
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
12
|
+
assertion: jwt_bearer_token
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def jwt_bearer_token
|
19
|
+
JWT.encode claim_set, private_key, 'RS256'
|
20
|
+
end
|
21
|
+
|
22
|
+
def claim_set
|
23
|
+
{
|
24
|
+
iss: @options[:client_id],
|
25
|
+
sub: @options[:username],
|
26
|
+
aud: @options[:host],
|
27
|
+
iat: Time.now.utc.to_i,
|
28
|
+
exp: Time.now.utc.to_i + 180
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def private_key
|
33
|
+
OpenSSL::PKey::RSA.new(@options[:jwt_key])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/restforce/version.rb
CHANGED
data/restforce.gemspec
CHANGED
@@ -28,12 +28,13 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.add_dependency 'faraday_middleware', ['>= 0.8.8', '<= 1.0']
|
29
29
|
|
30
30
|
gem.add_dependency 'json', '>= 1.7.5'
|
31
|
+
gem.add_dependency 'jwt', ['>= 1.5.6']
|
31
32
|
|
32
33
|
gem.add_dependency 'hashie', ['>= 1.2.0', '< 4.0']
|
33
34
|
|
34
35
|
gem.add_development_dependency 'faye' unless RUBY_PLATFORM == 'java'
|
35
36
|
gem.add_development_dependency 'rspec', '~> 2.14.0'
|
36
|
-
gem.add_development_dependency 'rspec_junit_formatter', '~> 0.
|
37
|
+
gem.add_development_dependency 'rspec_junit_formatter', '~> 0.4.1'
|
37
38
|
gem.add_development_dependency 'rubocop', '~> 0.75.0'
|
38
39
|
gem.add_development_dependency 'simplecov', '~> 0.17.1'
|
39
40
|
gem.add_development_dependency 'webmock', '~> 3.7.6'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpAIBAAKCAQEAy3KYqxZIgVDgFwdA+OQcKMJQu3iUTlyCSk9b3RLBOudnvk8u
|
3
|
+
n0ShtKkOKB4b4RZeedcrlKESoak/6NS+M7CDemRT0EagqUiz/ZsZxB2KUp7au+d8
|
4
|
+
0KWX99/loBjDttuon8ITDw2WFC9X0+TZqfsXcQ0iV1/9Sf8WHShd8ZqShjJBlEvf
|
5
|
+
7u7VdNW8dXrl+4cvpPzspVxg6jVotEpmp875jmGRvshgx0iz0jtfAyxaaKStITC6
|
6
|
+
MxufVNDgIYQDl6queh8b9noDLtt17Eq6YnropYN1hOjaLtoLBP7AN2gsXG7N3vqC
|
7
|
+
JG619W9X4zCmKztv4oGjymInrS2msC2J02dNGQIDAQABAoIBAAurTARsJ8Z7DA9m
|
8
|
+
FBzygIb59kV6eg8wkSyP9rXscHbfdPzeb88k0Z2aILy+VV0IumyEofRJdNce7RJ+
|
9
|
+
uVYfprrrbD9C/c4X5HMEZWrxQtDQWb1zXp5dESVfiz0ujnM7kCVxrUQsxFHuETyP
|
10
|
+
IMj2JPcQCMs4L0ACSJNtkE3eTs8xko5kwDHZGiLTi5jD1bLgaHl1A+9CTU8LosTy
|
11
|
+
hEIrNSZfNidDPU4QSbwoElYZxpDMSbtyHaIk1WHz7zLzWoogK3x5AIQh64wWAQVd
|
12
|
+
zzlp2j2jSM7oQ9j+k1aNiUBdDoRX53jmaIwE/1WDW/LT33qAoqRw+5qHeLRoRcfu
|
13
|
+
3uj/WI0CgYEA6wnpIUhqqWT+febhXtCr1mAJlAJpzUUQncN6Zk0Kj/kE1V52OqgL
|
14
|
+
gtOactII7J3+0zK7KGptqseTank0ghmGNdRBQ7+1JTQhpjLrCm/huKDhl+sBk95u
|
15
|
+
opxw/ZTwMFYPwsmZlFcy4uWRjtI+QzaV+2Xk5JF57H8vUiX/+XqseQcCgYEA3Zdw
|
16
|
+
zVHpcVPlyiXCbSvwb9IYXiJaQl/Rg96Klxah3MZNyRRKe5IoKUTJwEDuQ1MAHrve
|
17
|
+
cWrNLcXhX6r/PzIXSSLe71wgwpn7UcaqWzZJqqN7OIGEeTzYWbB6tGhse7Dw7tWB
|
18
|
+
hRkQSE0LPzZqboHz5msRM02sa61qiI5+ASJvIN8CgYEAvT+IoEzv3R89ruBVPQPm
|
19
|
+
KMHBVJSw3iArJex8xJxp0c0fMDJUHhyq0BdTd/pYRzVcNm/VtNAlJ2p07zlSpyKo
|
20
|
+
JvWV61gUIjWclnbPO+MkK4YWvzzxUz+5c2NlszjWQQU6wYuUBpZDmeBg2E++5F2y
|
21
|
+
W+8KY2QjeOJbltiUCCvXbccCgYEAqARYB5aARumyZqBS16xlVqQazeWGQqWcmzx2
|
22
|
+
ITGL8XZ7LGgyQZgE06XQw/F3t5yLjsIsXBr7ECXmST/C4gv9E/tYxm04edV/dfYI
|
23
|
+
3bhACx6CI8owxCyabwcdQwWam/8B8FX7KwxiCDBCwt9ju/7VDHVKSXgvsEWBbaF9
|
24
|
+
cSbG1EkCgYBZFztTUnD/cLMcvLUegN0K+6Qa3x3nRSrlrJ+v51mU1X8G8qNyFO67
|
25
|
+
gUq9h4xbCl4Z5ZTuFKXwPM4XaMzfYdrWNS2zl5IG14FXS077GhDKe062b9mFoxtm
|
26
|
+
aViCit4Hm8xpLTS8x9KB7yYAiF9sR/GklW1SUCIqnpL9JShkhzjfZw==
|
27
|
+
-----END RSA PRIVATE KEY-----
|
@@ -52,6 +52,16 @@ describe Restforce::Concerns::Authentication do
|
|
52
52
|
|
53
53
|
it { should eq Restforce::Middleware::Authentication::Token }
|
54
54
|
end
|
55
|
+
|
56
|
+
context 'when jwt option is provided' do
|
57
|
+
before do
|
58
|
+
client.stub username_password?: false
|
59
|
+
client.stub oauth_refresh?: false
|
60
|
+
client.stub jwt?: true
|
61
|
+
end
|
62
|
+
|
63
|
+
it { should eq Restforce::Middleware::Authentication::JWTBearer }
|
64
|
+
end
|
55
65
|
end
|
56
66
|
|
57
67
|
describe '.username_password?' do
|
@@ -100,4 +110,29 @@ describe Restforce::Concerns::Authentication do
|
|
100
110
|
it { should_not be_true }
|
101
111
|
end
|
102
112
|
end
|
113
|
+
|
114
|
+
describe '.jwt?' do
|
115
|
+
subject { client.jwt? }
|
116
|
+
let(:options) do
|
117
|
+
{}
|
118
|
+
end
|
119
|
+
|
120
|
+
before do
|
121
|
+
client.stub options: options
|
122
|
+
end
|
123
|
+
|
124
|
+
context 'when jwt options are provided' do
|
125
|
+
let(:options) do
|
126
|
+
{ jwt_key: 'JWT_PRIVATE_KEY',
|
127
|
+
username: 'foo',
|
128
|
+
client_id: 'client' }
|
129
|
+
end
|
130
|
+
|
131
|
+
it { should be_true }
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'when jwt options are not provided' do
|
135
|
+
it { should_not be_true }
|
136
|
+
end
|
137
|
+
end
|
103
138
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
describe Restforce::Middleware::Authentication::JWTBearer do
|
5
|
+
let(:jwt_key) { File.read('spec/fixtures/test_private.key') }
|
6
|
+
|
7
|
+
let(:options) do
|
8
|
+
{ host: 'login.salesforce.com',
|
9
|
+
client_id: 'client_id',
|
10
|
+
username: 'foo',
|
11
|
+
jwt_key: jwt_key,
|
12
|
+
instance_url: 'https://na1.salesforce.com',
|
13
|
+
adapter: :net_http }
|
14
|
+
end
|
15
|
+
|
16
|
+
it_behaves_like 'authentication middleware' do
|
17
|
+
let(:success_request) do
|
18
|
+
stub_login_request(
|
19
|
+
body: "grant_type=grant_type—urn:ietf:params:oauth:grant-type:jwt-bearer&" \
|
20
|
+
"assertion=abc1234567890"
|
21
|
+
).to_return(status: 200, body: fixture(:auth_success_response))
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:fail_request) do
|
25
|
+
stub_login_request(
|
26
|
+
body: "grant_type=grant_type—urn:ietf:params:oauth:grant-type:jwt-bearer&" \
|
27
|
+
"assertion=abc1234567890"
|
28
|
+
).to_return(status: 400, body: fixture(:refresh_error_response))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'allows jwt_key as string' do
|
33
|
+
let(:jwt_key) do
|
34
|
+
File.read('spec/fixtures/test_private.key')
|
35
|
+
end
|
36
|
+
|
37
|
+
let(:options) do
|
38
|
+
{ host: 'login.salesforce.com',
|
39
|
+
client_id: 'client_id',
|
40
|
+
username: 'foo',
|
41
|
+
jwt_key: jwt_key,
|
42
|
+
instance_url: 'https://na1.salesforce.com',
|
43
|
+
adapter: :net_http }
|
44
|
+
end
|
45
|
+
|
46
|
+
it_behaves_like 'authentication middleware' do
|
47
|
+
let(:success_request) do
|
48
|
+
stub_login_request(
|
49
|
+
body: "grant_type=grant_type—urn:ietf:params:oauth:grant-type:jwt-bearer&" \
|
50
|
+
"assertion=abc1234567890"
|
51
|
+
).to_return(status: 200, body: fixture(:auth_success_response))
|
52
|
+
end
|
53
|
+
|
54
|
+
let(:fail_request) do
|
55
|
+
stub_login_request(
|
56
|
+
body: "grant_type=grant_type—urn:ietf:params:oauth:grant-type:jwt-bearer&" \
|
57
|
+
"assertion=abc1234567890"
|
58
|
+
).to_return(status: 400, body: fixture(:refresh_error_response))
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restforce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric J. Holmes
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-10-
|
12
|
+
date: 2019-10-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -65,6 +65,20 @@ dependencies:
|
|
65
65
|
- - ">="
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: 1.7.5
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: jwt
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.5.6
|
75
|
+
type: :runtime
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 1.5.6
|
68
82
|
- !ruby/object:Gem::Dependency
|
69
83
|
name: hashie
|
70
84
|
requirement: !ruby/object:Gem::Requirement
|
@@ -119,14 +133,14 @@ dependencies:
|
|
119
133
|
requirements:
|
120
134
|
- - "~>"
|
121
135
|
- !ruby/object:Gem::Version
|
122
|
-
version: 0.
|
136
|
+
version: 0.4.1
|
123
137
|
type: :development
|
124
138
|
prerelease: false
|
125
139
|
version_requirements: !ruby/object:Gem::Requirement
|
126
140
|
requirements:
|
127
141
|
- - "~>"
|
128
142
|
- !ruby/object:Gem::Version
|
129
|
-
version: 0.
|
143
|
+
version: 0.4.1
|
130
144
|
- !ruby/object:Gem::Dependency
|
131
145
|
name: rubocop
|
132
146
|
requirement: !ruby/object:Gem::Requirement
|
@@ -210,6 +224,7 @@ files:
|
|
210
224
|
- lib/restforce/mash.rb
|
211
225
|
- lib/restforce/middleware.rb
|
212
226
|
- lib/restforce/middleware/authentication.rb
|
227
|
+
- lib/restforce/middleware/authentication/jwt_bearer.rb
|
213
228
|
- lib/restforce/middleware/authentication/password.rb
|
214
229
|
- lib/restforce/middleware/authentication/token.rb
|
215
230
|
- lib/restforce/middleware/authorization.rb
|
@@ -266,6 +281,7 @@ files:
|
|
266
281
|
- spec/fixtures/sobject/upsert_multiple_error_response.json
|
267
282
|
- spec/fixtures/sobject/upsert_updated_success_response.json
|
268
283
|
- spec/fixtures/sobject/write_error_response.json
|
284
|
+
- spec/fixtures/test_private.key
|
269
285
|
- spec/integration/abstract_client_spec.rb
|
270
286
|
- spec/integration/data/client_spec.rb
|
271
287
|
- spec/spec_helper.rb
|
@@ -291,6 +307,7 @@ files:
|
|
291
307
|
- spec/unit/data/client_spec.rb
|
292
308
|
- spec/unit/document_spec.rb
|
293
309
|
- spec/unit/mash_spec.rb
|
310
|
+
- spec/unit/middleware/authentication/jwt_bearer_spec.rb
|
294
311
|
- spec/unit/middleware/authentication/password_spec.rb
|
295
312
|
- spec/unit/middleware/authentication/token_spec.rb
|
296
313
|
- spec/unit/middleware/authentication_spec.rb
|
@@ -364,6 +381,7 @@ test_files:
|
|
364
381
|
- spec/fixtures/sobject/upsert_multiple_error_response.json
|
365
382
|
- spec/fixtures/sobject/upsert_updated_success_response.json
|
366
383
|
- spec/fixtures/sobject/write_error_response.json
|
384
|
+
- spec/fixtures/test_private.key
|
367
385
|
- spec/integration/abstract_client_spec.rb
|
368
386
|
- spec/integration/data/client_spec.rb
|
369
387
|
- spec/spec_helper.rb
|
@@ -389,6 +407,7 @@ test_files:
|
|
389
407
|
- spec/unit/data/client_spec.rb
|
390
408
|
- spec/unit/document_spec.rb
|
391
409
|
- spec/unit/mash_spec.rb
|
410
|
+
- spec/unit/middleware/authentication/jwt_bearer_spec.rb
|
392
411
|
- spec/unit/middleware/authentication/password_spec.rb
|
393
412
|
- spec/unit/middleware/authentication/token_spec.rb
|
394
413
|
- spec/unit/middleware/authentication_spec.rb
|