nuid-sdk 0.1.0 → 0.1.1
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/.gitignore +2 -0
- data/Gemfile.lock +3 -1
- data/README.md +65 -8
- data/lib/nuid/sdk.rb +1 -1
- data/lib/nuid/sdk/api/auth.rb +143 -0
- data/lib/nuid/sdk/version.rb +1 -1
- data/nuid-sdk.gemspec +1 -0
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d870c8df47c135af740aa98e693bfe2fea401eb1014002a719ea05d518bca0eb
|
4
|
+
data.tar.gz: f52d91f7d14c678daa906c173e1c5a058fbb4d952e132521aee32019d4a3944b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7c35e9a6771a5c9b994c0e64844237f3948374343ee3941b72819b9f8f666cea1750078f2ac61ecfc4ca263d89e7b83c7c68bdc7ac2524a36acb22dfc0cbe6d
|
7
|
+
data.tar.gz: 64b7386e55889c4a597866e07661ced6008fc06abb65bb81977f65d83fbb21e1cb6713e993838e3f6fce511669e64a9f62c8038f50a10f324892de6b9aba16e7
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
nuid-sdk (0.1.
|
4
|
+
nuid-sdk (0.1.1)
|
5
5
|
httparty (~> 0.18.1)
|
6
6
|
|
7
7
|
GEM
|
@@ -16,6 +16,7 @@ GEM
|
|
16
16
|
minitest (5.14.3)
|
17
17
|
multi_xml (0.6.0)
|
18
18
|
rake (12.3.3)
|
19
|
+
yard (0.9.26)
|
19
20
|
|
20
21
|
PLATFORMS
|
21
22
|
ruby
|
@@ -24,6 +25,7 @@ DEPENDENCIES
|
|
24
25
|
minitest (~> 5.0)
|
25
26
|
nuid-sdk!
|
26
27
|
rake (~> 12.0)
|
28
|
+
yard (~> 0.9)
|
27
29
|
|
28
30
|
BUNDLED WITH
|
29
31
|
2.1.4
|
data/README.md
CHANGED
@@ -5,8 +5,8 @@
|
|
5
5
|
This repo provides a Ruby Gem for interacting with NuID APIs within Ruby
|
6
6
|
applications.
|
7
7
|
|
8
|
-
Read the latest [
|
9
|
-
docs](
|
8
|
+
Read the latest [gem
|
9
|
+
docs](https://rubydoc.info/gems/nuid-sdk/) or
|
10
10
|
checkout the [platform docs](https://portal.nuid.io/docs) for API docs, guides,
|
11
11
|
video tutorials, and more.
|
12
12
|
|
@@ -15,14 +15,14 @@ video tutorials, and more.
|
|
15
15
|
From [rubygems](https://rubygems.org/gems/nuid-sdk):
|
16
16
|
|
17
17
|
```sh
|
18
|
-
gem install nuid-sdk -v "0.1.
|
18
|
+
gem install nuid-sdk -v "0.1.1"
|
19
19
|
```
|
20
20
|
|
21
21
|
Or with bundler:
|
22
22
|
|
23
23
|
```ruby
|
24
24
|
# Gemfile
|
25
|
-
gem "nuid-sdk", "~> 0.1.
|
25
|
+
gem "nuid-sdk", "~> 0.1.1"
|
26
26
|
```
|
27
27
|
|
28
28
|
## Usage
|
@@ -30,9 +30,8 @@ gem "nuid-sdk", "~> 0.1.0"
|
|
30
30
|
Example rails auth controller.
|
31
31
|
|
32
32
|
For a more detailed example visit the [Integrating with
|
33
|
-
NuID](https://portal.nuid.io/docs/guides/integrating-with-nuid) guide and
|
34
|
-
accompanying
|
35
|
-
[node-example](https://github.com/NuID/node-example/tree/bj/client-server-apps).
|
33
|
+
NuID](https://portal.nuid.io/docs/guides/integrating-with-nuid) guide and the
|
34
|
+
accompanying [examples repo](https://github.com/NuID/examples).
|
36
35
|
A ruby-specific code example is coming soon.
|
37
36
|
|
38
37
|
```ruby
|
@@ -41,11 +40,19 @@ require "nuid-sdk"
|
|
41
40
|
class UsersController < ApplicationController
|
42
41
|
NUID_API = ::NuID::SDK::API::Auth.new(ENV["NUID_API_KEY"])
|
43
42
|
|
43
|
+
# The registration form should send the verified credential to be
|
44
|
+
# recorded in the NuID Auth API. The response to that interaction
|
45
|
+
# will provide a `nu/id` key in the response which should be stored
|
46
|
+
# with the newly created user record.
|
47
|
+
#
|
48
|
+
# The "verified credential" is generated by your client application
|
49
|
+
# using `Zk.verifiableFromSecret(password)` from the `@nuid/zk` npm
|
50
|
+
# package.
|
44
51
|
def register
|
45
52
|
credential_res = NUID_API.credential_create(params[:verified_credential])
|
46
53
|
if credential_res.ok?
|
47
54
|
user_params = params.require(:email, :first_name, :last_name)
|
48
|
-
.merge({nuid: credential_res.
|
55
|
+
.merge({nuid: credential_res.parsed_response["nu/id"]})
|
49
56
|
@current_user = User.create(user_params)
|
50
57
|
render json: @current_user, status: :created
|
51
58
|
else
|
@@ -55,6 +62,56 @@ class UsersController < ApplicationController
|
|
55
62
|
end
|
56
63
|
```
|
57
64
|
|
65
|
+
``` ruby
|
66
|
+
require "nuid-sdk"
|
67
|
+
|
68
|
+
class SessionsController < ApplicationController
|
69
|
+
NUID_API = ::NuID::SDK::API::Auth.new(ENV["NUID_API_KEY"])
|
70
|
+
|
71
|
+
# Get a challenge from the Auth API. The client form should request
|
72
|
+
# a challenge as the first of two phases to login. Once a succesful
|
73
|
+
# challenge has been fetched, return it to the client so a proof
|
74
|
+
# can be generated from the challenge claims and the user's password.
|
75
|
+
def login_challenge
|
76
|
+
user = User.find(email: params[:email])
|
77
|
+
return render(status: :unauthorized) unless user
|
78
|
+
|
79
|
+
credential_res = NUID_API.credential_get(user.nuid)
|
80
|
+
return render(status: :unauthorized) unless credential_res.ok?
|
81
|
+
|
82
|
+
credential = credential_res.parsed_response["nuid/credential"]
|
83
|
+
challenge_res = NUID_API.challenge_get(credential)
|
84
|
+
return render(status: :unauthorized) unless credential_res.ok?
|
85
|
+
|
86
|
+
challenge_jwt = challenge_res.parsed_response["nuid.credential.challenge/jwt"]
|
87
|
+
render json: {challenge_jwt: challenge_jwt}
|
88
|
+
end
|
89
|
+
|
90
|
+
# Verify is the second part of the login process. The params
|
91
|
+
# provided here include the user identification param (email or
|
92
|
+
# username), the unaltered challenge_jwt retrieved in phase 1 of login
|
93
|
+
# (see #login_challenge above), and the proof that was generated from
|
94
|
+
# the challenge_jwt claims and the user secret.
|
95
|
+
#
|
96
|
+
# The "proof" is generated by your client application using
|
97
|
+
# `Zk.proofFromSecretAndChallenge(password, challenge_jwt)` from the
|
98
|
+
# `@nuid/zk` npm package.
|
99
|
+
def login_verify
|
100
|
+
user = User.find(email: params[:email])
|
101
|
+
return render(status: :unauthorized) unless user
|
102
|
+
|
103
|
+
verify_res = NUID_API.challenge_verify(params[:challenge_jwt], params[:proof])
|
104
|
+
if res.ok?
|
105
|
+
@current_user = user
|
106
|
+
# issue session ...
|
107
|
+
render(json: @current_user)
|
108
|
+
else
|
109
|
+
render(status: :unathorized)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
```
|
114
|
+
|
58
115
|
## Development
|
59
116
|
|
60
117
|
You'll want to download docker to run the tests, as we depend on the
|
data/lib/nuid/sdk.rb
CHANGED
data/lib/nuid/sdk/api/auth.rb
CHANGED
@@ -1,12 +1,104 @@
|
|
1
1
|
require "httparty"
|
2
2
|
|
3
3
|
module NuID::SDK::API
|
4
|
+
|
5
|
+
# This class wraps the NuID Auth API endpoints for simpler integration into
|
6
|
+
# existing authentication flows.
|
7
|
+
#
|
8
|
+
# @example User Registration
|
9
|
+
# require "nuid-sdk"
|
10
|
+
#
|
11
|
+
# class UsersController < ApplicationController
|
12
|
+
# NUID_API = ::NuID::SDK::API::Auth.new(ENV["NUID_API_KEY"])
|
13
|
+
#
|
14
|
+
# # The registration form should send the verified credential to be
|
15
|
+
# # recorded in the NuID Auth API. The response to that interaction
|
16
|
+
# # will provide a `nu/id` key in the response which should be stored
|
17
|
+
# # with the newly created user record.
|
18
|
+
# #
|
19
|
+
# # The "verified credential" is generated by your client application
|
20
|
+
# # using `Zk.verifiableFromSecret(password)` from the `@nuid/zk` npm
|
21
|
+
# # package.
|
22
|
+
# def register
|
23
|
+
# credential_res = NUID_API.credential_create(params[:verified_credential])
|
24
|
+
# return render(status: :unauthorized) unless credential_res.ok?
|
25
|
+
# if credential_res.ok?
|
26
|
+
# user_params = params.require(:email, :first_name, :last_name)
|
27
|
+
# .merge({nuid: credential_res.parsed_response["nu/id"]})
|
28
|
+
# @current_user = User.create(user_params)
|
29
|
+
# render json: @current_user, status: :created
|
30
|
+
# else
|
31
|
+
# render status: :bad_request
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# @example User Login
|
37
|
+
# require "nuid-sdk"
|
38
|
+
#
|
39
|
+
# class SessionsController < ApplicationController
|
40
|
+
# NUID_API = ::NuID::SDK::API::Auth.new(ENV["NUID_API_KEY"])
|
41
|
+
#
|
42
|
+
# # Get a challenge from the Auth API. The client form should request
|
43
|
+
# # a challenge as the first of two phases to login. Once a succesful
|
44
|
+
# # challenge has been fetched, return it to the client so a proof
|
45
|
+
# # can be generated from the challenge claims and the user's password.
|
46
|
+
# def login_challenge
|
47
|
+
# user = User.find(email: params[:email])
|
48
|
+
# return render(status: :unauthorized) unless user
|
49
|
+
#
|
50
|
+
# credential_res = NUID_API.credential_get(user.nuid)
|
51
|
+
# return render(status: :unauthorized) unless credential_res.ok?
|
52
|
+
#
|
53
|
+
# credential = credential_res.parsed_response["nuid/credential"]
|
54
|
+
# challenge_res = NUID_API.challenge_get(credential)
|
55
|
+
# return render(status: :unauthorized) unless credential_res.ok?
|
56
|
+
#
|
57
|
+
# challenge_jwt = challenge_res.parsed_response["nuid.credential.challenge/jwt"]
|
58
|
+
# render json: {challenge_jwt: challenge_jwt}
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# # Verify is the second part of the login process. The params
|
62
|
+
# # provided here include the user identification param (email or
|
63
|
+
# # username), the unaltered challenge_jwt retrieved in phase 1 of login
|
64
|
+
# # (see #login_challenge above), and the proof that was generated from
|
65
|
+
# # the challenge_jwt claims and the user secret.
|
66
|
+
# #
|
67
|
+
# # The "proof" is generated by your client application using
|
68
|
+
# # `Zk.proofFromSecretAndChallenge(password, challenge_jwt)` from the
|
69
|
+
# # `@nuid/zk` npm package.
|
70
|
+
# def login_verify
|
71
|
+
# user = User.find(email: params[:email])
|
72
|
+
# return render(status: :unauthorized) unless user
|
73
|
+
#
|
74
|
+
# verify_res = NUID_API.challenge_verify(params[:challenge_jwt], params[:proof])
|
75
|
+
# if res.ok?
|
76
|
+
# @current_user = user
|
77
|
+
# # issue session ...
|
78
|
+
# render(json: @current_user)
|
79
|
+
# else
|
80
|
+
# render(status: :unathorized)
|
81
|
+
# end
|
82
|
+
# end
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
#
|
86
|
+
# @see https://www.npmjs.com/package/@nuid/zk
|
87
|
+
# @see https://www.npmjs.com/package/@nuid/cli
|
4
88
|
class Auth
|
5
89
|
include HTTParty
|
6
90
|
base_uri "https://auth.nuid.io"
|
7
91
|
|
8
92
|
attr_reader :api_key
|
9
93
|
|
94
|
+
# Create an HTTParty instance for dispatching HTTP requests.
|
95
|
+
#
|
96
|
+
# All endpoints return the HTTParty Response object, with
|
97
|
+
# `HTTParty::Response#parsed_response` containing the JSON body converted to
|
98
|
+
# a hash.
|
99
|
+
#
|
100
|
+
# @param api_key [string] The Auth API Key
|
101
|
+
# @see https://portal.nuid.io
|
10
102
|
def initialize(api_key)
|
11
103
|
@api_key = api_key
|
12
104
|
self.class.headers({
|
@@ -15,10 +107,37 @@ module NuID::SDK::API
|
|
15
107
|
})
|
16
108
|
end
|
17
109
|
|
110
|
+
# Get a credential `challenge` from the API, usually during login flow.
|
111
|
+
# The returned `challenge` can be used to generate a proof from the user's
|
112
|
+
# secret. Used in conjunction with #challenge_verify.
|
113
|
+
#
|
114
|
+
# @see https://www.npmjs.com/package/@nuid/zk
|
115
|
+
# @see https://www.npmjs.com/package/@nuid/cli
|
116
|
+
#
|
117
|
+
# @param credential [Hash] A `credential` is usually returned by the
|
118
|
+
# #credential_get method
|
119
|
+
# @return [HTTParty::Response] use
|
120
|
+
# HTTParty::Response#parsed_response["nuid.credential.challenge/jwt"] to
|
121
|
+
# get the challenge JWT from the parsed response
|
18
122
|
def challenge_get(credential)
|
19
123
|
_post("/challenge", {"nuid/credential" => credential})
|
20
124
|
end
|
21
125
|
|
126
|
+
# Verify a credential challenge with a proof generated from the challenge
|
127
|
+
# claims and the user's secret. Generated proof from the claims contained in
|
128
|
+
# the `challenge_jwt` and the user's secret. This proof is generated by
|
129
|
+
# `Zk.proofFromSecretAndChallenge(secret, challenge)` available in the npm
|
130
|
+
# package `@nuid/zk`.
|
131
|
+
#
|
132
|
+
# @see https://www.npmjs.com/package/@nuid/zk
|
133
|
+
# @see https://www.npmjs.com/package/@nuid/cli
|
134
|
+
#
|
135
|
+
# @param [String] challenge_jwt the `nuid.credential.challenge/jwt` returned
|
136
|
+
# by #challenge_get
|
137
|
+
# @param [Hash] proof the generated proof from the challenge jwt claims and
|
138
|
+
# user secret
|
139
|
+
# @return [HTTParty::Response] use `Response#parsed_response["nu/id"]` to get the
|
140
|
+
# parsed JSON body
|
22
141
|
def challenge_verify(challenge_jwt, proof)
|
23
142
|
_post("/challenge/verify", {
|
24
143
|
"nuid.credential.challenge/jwt" => challenge_jwt,
|
@@ -26,10 +145,34 @@ module NuID::SDK::API
|
|
26
145
|
})
|
27
146
|
end
|
28
147
|
|
148
|
+
# Create a credential from a verified credential (meaning a credential
|
149
|
+
# generated from the user's secret). Usually used during user registration.
|
150
|
+
# The parsed response body contains the new credential and the user's unique
|
151
|
+
# "nu/id" which should be used as a reference to the user's credential for
|
152
|
+
# later authentication attempts.
|
153
|
+
#
|
154
|
+
# @see #credential_get
|
155
|
+
# @see https://www.npmjs.com/package/@nuid/zk
|
156
|
+
# @see https://www.npmjs.com/package/@nuid/cli
|
157
|
+
#
|
158
|
+
# @param verified_credential [Hash] The hash returned by calling `Zk.verifiableFromSecret(secret)`
|
159
|
+
# @return [HTTParty::Response] use `Response#parsed_response` to get the
|
160
|
+
# parsed JSON body
|
29
161
|
def credential_create(verified_credential)
|
30
162
|
_post("/credential", {"nuid.credential/verified" => verified_credential})
|
31
163
|
end
|
32
164
|
|
165
|
+
# Fetch a credential by it's unique `nuid`. The `nu/id` paramter is extracted
|
166
|
+
# from the `#parsed_response` of #credential_create.
|
167
|
+
#
|
168
|
+
# Generally you will end up storing the nuid with your user record during
|
169
|
+
# registration. Later during login use the nuid to fetch the credential
|
170
|
+
# using this method, and pass the Response#parsed_response directly to
|
171
|
+
# #challenge_get.
|
172
|
+
#
|
173
|
+
# @param [String] nuid unique key for the credential
|
174
|
+
# @return [HTTParty::Response] use `Response#parsed_response` to get the
|
175
|
+
# parsed JSON body
|
33
176
|
def credential_get(nuid)
|
34
177
|
self.class.get("/credential/#{nuid}")
|
35
178
|
end
|
data/lib/nuid/sdk/version.rb
CHANGED
data/nuid-sdk.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.metadata["changelog_uri"] = "https://github.com/NuID/sdk-ruby/blob/master/CHANGELOG.md"
|
19
19
|
|
20
20
|
spec.add_dependency "httparty", "~> 0.18.1"
|
21
|
+
spec.add_development_dependency "yard", "~> 0.9"
|
21
22
|
|
22
23
|
# Specify which files should be added to the gem when it is released.
|
23
24
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nuid-sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- BJ Neilsen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.18.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: yard
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.9'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.9'
|
27
41
|
description:
|
28
42
|
email:
|
29
43
|
- bj.neilsen@gmail.com
|
@@ -71,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
71
85
|
- !ruby/object:Gem::Version
|
72
86
|
version: '0'
|
73
87
|
requirements: []
|
74
|
-
rubygems_version: 3.
|
88
|
+
rubygems_version: 3.2.8
|
75
89
|
signing_key:
|
76
90
|
specification_version: 4
|
77
91
|
summary: SDK for interacting with NuID APIs in Ruby
|