nuid-sdk 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|