passageidentity 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/README.md +18 -61
  4. data/docs/custom/AuthApi.md +141 -0
  5. data/docs/custom/ClientApi.md +107 -0
  6. data/docs/custom/UserApi.md +419 -0
  7. data/docs/generated/AppInfo.md +94 -0
  8. data/docs/generated/AppResponse.md +18 -0
  9. data/docs/generated/AppsApi.md +77 -0
  10. data/docs/generated/AuthMethods.md +22 -0
  11. data/docs/generated/CreateMagicLinkRequest.md +36 -0
  12. data/docs/generated/CreateUserRequest.md +22 -0
  13. data/docs/generated/ElementCustomization.md +56 -0
  14. data/docs/generated/FontFamily.md +15 -0
  15. data/docs/generated/LayoutConfig.md +26 -0
  16. data/docs/generated/Layouts.md +20 -0
  17. data/docs/generated/ListDevicesResponse.md +18 -0
  18. data/docs/generated/MagicLink.md +36 -0
  19. data/docs/generated/MagicLinkAuthMethod.md +22 -0
  20. data/docs/generated/MagicLinkChannel.md +15 -0
  21. data/docs/generated/MagicLinkResponse.md +18 -0
  22. data/docs/generated/MagicLinkType.md +15 -0
  23. data/docs/generated/MagicLinksApi.md +79 -0
  24. data/docs/generated/Model400Error.md +20 -0
  25. data/docs/generated/Model401Error.md +20 -0
  26. data/docs/generated/Model404Error.md +20 -0
  27. data/docs/generated/Model500Error.md +20 -0
  28. data/docs/generated/OtpAuthMethod.md +22 -0
  29. data/docs/generated/PasskeysAuthMethod.md +18 -0
  30. data/docs/generated/Technologies.md +15 -0
  31. data/docs/generated/TokensApi.md +78 -0
  32. data/docs/generated/TtlDisplayUnit.md +15 -0
  33. data/docs/generated/UpdateMagicLinkAuthMethod.md +22 -0
  34. data/docs/generated/UpdateOtpAuthMethod.md +22 -0
  35. data/docs/generated/UpdatePasskeysAuthMethod.md +18 -0
  36. data/docs/generated/UpdateUserRequest.md +22 -0
  37. data/docs/generated/UserDevicesApi.md +152 -0
  38. data/docs/generated/UserEventInfo.md +26 -0
  39. data/docs/generated/UserInfo.md +46 -0
  40. data/docs/generated/UserMetadataField.md +28 -0
  41. data/docs/generated/UserMetadataFieldType.md +15 -0
  42. data/docs/generated/UserResponse.md +18 -0
  43. data/docs/generated/UserStatus.md +15 -0
  44. data/docs/generated/UsersApi.md +440 -0
  45. data/docs/generated/WebAuthnDevices.md +34 -0
  46. data/docs/generated/WebAuthnIcons.md +20 -0
  47. data/docs/generated/WebAuthnType.md +15 -0
  48. data/generate.sh +31 -0
  49. data/lib/openapi_client/api/apps_api.rb +85 -0
  50. data/lib/openapi_client/api/magic_links_api.rb +96 -0
  51. data/lib/openapi_client/api/tokens_api.rb +91 -0
  52. data/lib/openapi_client/api/user_devices_api.rb +166 -0
  53. data/lib/openapi_client/api/users_api.rb +452 -0
  54. data/lib/openapi_client/api_client.rb +431 -0
  55. data/lib/openapi_client/api_error.rb +58 -0
  56. data/lib/openapi_client/configuration.rb +383 -0
  57. data/lib/openapi_client/models/app_info.rb +853 -0
  58. data/lib/openapi_client/models/app_response.rb +221 -0
  59. data/lib/openapi_client/models/auth_methods.rb +254 -0
  60. data/lib/openapi_client/models/create_magic_link_request.rb +374 -0
  61. data/lib/openapi_client/models/create_user_request.rb +234 -0
  62. data/lib/openapi_client/models/element_customization.rb +457 -0
  63. data/lib/openapi_client/models/font_family.rb +58 -0
  64. data/lib/openapi_client/models/layout_config.rb +285 -0
  65. data/lib/openapi_client/models/layouts.rb +241 -0
  66. data/lib/openapi_client/models/list_devices_response.rb +223 -0
  67. data/lib/openapi_client/models/magic_link.rb +387 -0
  68. data/lib/openapi_client/models/magic_link_auth_method.rb +302 -0
  69. data/lib/openapi_client/models/magic_link_channel.rb +40 -0
  70. data/lib/openapi_client/models/magic_link_response.rb +221 -0
  71. data/lib/openapi_client/models/magic_link_type.rb +40 -0
  72. data/lib/openapi_client/models/model400_error.rb +271 -0
  73. data/lib/openapi_client/models/model401_error.rb +271 -0
  74. data/lib/openapi_client/models/model404_error.rb +271 -0
  75. data/lib/openapi_client/models/model500_error.rb +271 -0
  76. data/lib/openapi_client/models/otp_auth_method.rb +302 -0
  77. data/lib/openapi_client/models/passkeys_auth_method.rb +228 -0
  78. data/lib/openapi_client/models/technologies.rb +46 -0
  79. data/lib/openapi_client/models/ttl_display_unit.rb +42 -0
  80. data/lib/openapi_client/models/update_magic_link_auth_method.rb +276 -0
  81. data/lib/openapi_client/models/update_otp_auth_method.rb +276 -0
  82. data/lib/openapi_client/models/update_passkeys_auth_method.rb +216 -0
  83. data/lib/openapi_client/models/update_user_request.rb +232 -0
  84. data/lib/openapi_client/models/user_event_info.rb +285 -0
  85. data/lib/openapi_client/models/user_info.rb +470 -0
  86. data/lib/openapi_client/models/user_metadata_field.rb +323 -0
  87. data/lib/openapi_client/models/user_metadata_field_type.rb +44 -0
  88. data/lib/openapi_client/models/user_response.rb +221 -0
  89. data/lib/openapi_client/models/user_status.rb +41 -0
  90. data/lib/openapi_client/models/web_authn_devices.rb +378 -0
  91. data/lib/openapi_client/models/web_authn_icons.rb +230 -0
  92. data/lib/openapi_client/models/web_authn_type.rb +41 -0
  93. data/lib/openapi_client/version.rb +15 -0
  94. data/lib/openapi_client.rb +74 -0
  95. data/lib/passageidentity/auth.rb +32 -5
  96. data/lib/passageidentity/client.rb +17 -121
  97. data/lib/passageidentity/user_api.rb +29 -131
  98. data/lib/passageidentity/version.rb +5 -0
  99. data/openapitools.json +7 -0
  100. data/passageidentity.gemspec +3 -1
  101. data/tests/auth_test.rb +6 -1
  102. data/tests/magic_link_test.rb +5 -4
  103. data/tests/user_api_test.rb +2 -2
  104. metadata +96 -2
@@ -0,0 +1,74 @@
1
+ =begin
2
+ #Passage Management API
3
+
4
+ #Passage's management API to manage your Passage apps and users.
5
+
6
+ The version of the OpenAPI document: 1
7
+ Contact: support@passage.id
8
+ Generated by: https://openapi-generator.tech
9
+ OpenAPI Generator version: 7.1.0
10
+
11
+ =end
12
+
13
+ # Common files
14
+ require_relative 'openapi_client/api_client'
15
+ require_relative 'openapi_client/api_error'
16
+ require_relative 'openapi_client/version'
17
+ require_relative 'openapi_client/configuration'
18
+
19
+ # Models
20
+ require_relative 'openapi_client/models/app_info'
21
+ require_relative 'openapi_client/models/app_response'
22
+ require_relative 'openapi_client/models/auth_methods'
23
+ require_relative 'openapi_client/models/create_magic_link_request'
24
+ require_relative 'openapi_client/models/create_user_request'
25
+ require_relative 'openapi_client/models/element_customization'
26
+ require_relative 'openapi_client/models/font_family'
27
+ require_relative 'openapi_client/models/layout_config'
28
+ require_relative 'openapi_client/models/layouts'
29
+ require_relative 'openapi_client/models/list_devices_response'
30
+ require_relative 'openapi_client/models/magic_link_auth_method'
31
+ require_relative 'openapi_client/models/magic_link'
32
+ require_relative 'openapi_client/models/magic_link_channel'
33
+ require_relative 'openapi_client/models/magic_link_response'
34
+ require_relative 'openapi_client/models/magic_link_type'
35
+ require_relative 'openapi_client/models/model400_error'
36
+ require_relative 'openapi_client/models/model401_error'
37
+ require_relative 'openapi_client/models/model404_error'
38
+ require_relative 'openapi_client/models/model500_error'
39
+ require_relative 'openapi_client/models/otp_auth_method'
40
+ require_relative 'openapi_client/models/passkeys_auth_method'
41
+ require_relative 'openapi_client/models/technologies'
42
+ require_relative 'openapi_client/models/ttl_display_unit'
43
+ require_relative 'openapi_client/models/update_magic_link_auth_method'
44
+ require_relative 'openapi_client/models/update_otp_auth_method'
45
+ require_relative 'openapi_client/models/update_passkeys_auth_method'
46
+ require_relative 'openapi_client/models/update_user_request'
47
+ require_relative 'openapi_client/models/user_event_info'
48
+ require_relative 'openapi_client/models/user_info'
49
+ require_relative 'openapi_client/models/user_metadata_field'
50
+ require_relative 'openapi_client/models/user_metadata_field_type'
51
+ require_relative 'openapi_client/models/user_response'
52
+ require_relative 'openapi_client/models/user_status'
53
+ require_relative 'openapi_client/models/web_authn_devices'
54
+ require_relative 'openapi_client/models/web_authn_icons'
55
+ require_relative 'openapi_client/models/web_authn_type'
56
+
57
+ # APIs
58
+ require_relative 'openapi_client/api/apps_api'
59
+ require_relative 'openapi_client/api/magic_links_api'
60
+ require_relative 'openapi_client/api/tokens_api'
61
+ require_relative 'openapi_client/api/user_devices_api'
62
+ require_relative 'openapi_client/api/users_api'
63
+
64
+ module OpenapiClient
65
+ class << self
66
+ def configure
67
+ if block_given?
68
+ yield(Configuration.default)
69
+ else
70
+ Configuration.default
71
+ end
72
+ end
73
+ end
74
+ end
@@ -2,22 +2,24 @@ require "openssl"
2
2
  require "base64"
3
3
  require "jwt"
4
4
  require_relative "client"
5
+ require_relative "../openapi_client"
5
6
 
6
7
  module Passage
7
8
  class Auth
8
9
  @@app_cache = {}
9
- def initialize(app_id, auth_strategy, connection)
10
+ def initialize(app_id, auth_strategy)
10
11
  @app_id = app_id
11
12
  @auth_strategy = auth_strategy
12
- @connection = connection
13
13
 
14
14
  fetch_jwks
15
15
  end
16
16
 
17
17
  def fetch_app()
18
18
  begin
19
- response = @connection.get("/v1/apps/#{@app_id}")
20
- return response.body["app"]
19
+ client = OpenapiClient::AppsApi.new
20
+ response = client.get_app(@app_id)
21
+
22
+ return response.app
21
23
  rescue Faraday::Error => e
22
24
  raise PassageError.new(
23
25
  message: "failed to fetch passage app",
@@ -43,7 +45,8 @@ module Passage
43
45
 
44
46
  # fetch the public key if not in cache
45
47
  app = fetch_app
46
- @auth_origin = app["auth_origin"]
48
+
49
+ @auth_origin = app.auth_origin
47
50
  response =
48
51
  auth_gw_connection.get("/v1/apps/#{@app_id}/.well-known/jwks.json")
49
52
  @jwks = response.body
@@ -52,6 +55,8 @@ module Passage
52
55
  end
53
56
 
54
57
  def authenticate_request(request)
58
+ warn "[DEPRECATION] `auth.authenticate_request()` is deprecated. Please use `auth.validate_jwt()` instead."
59
+
55
60
  # Get the token based on the strategy
56
61
  if @auth_strategy === Passage::COOKIE_STRATEGY
57
62
  unless request.cookies.key?("psg_auth_token")
@@ -78,6 +83,14 @@ module Passage
78
83
  nil
79
84
  end
80
85
 
86
+ def validate_jwt(token)
87
+ if token
88
+ return authenticate_token(token)
89
+ else
90
+ raise PassageError.new(message: "no authentication token")
91
+ end
92
+ end
93
+
81
94
  def authenticate_token(token)
82
95
  begin
83
96
  kid = JWT.decode(token, nil, false)[1]["kid"]
@@ -114,5 +127,19 @@ module Passage
114
127
  raise PassageError.new(message: e.message)
115
128
  end
116
129
  end
130
+
131
+ def revoke_user_refresh_tokens(user_id)
132
+ begin
133
+ client = OpenapiClient::TokensApi.new
134
+ response = client.revoke_user_refresh_tokens(@app_id, user_id)
135
+ return true
136
+ rescue Faraday::Error => e
137
+ raise PassageError.new(
138
+ message: "failed to revoke user's refresh tokens",
139
+ status_code: e.response[:status],
140
+ body: e.response[:body]
141
+ )
142
+ end
143
+ end
117
144
  end
118
145
  end
@@ -3,67 +3,11 @@
3
3
  require_relative "auth"
4
4
  require_relative "user_api"
5
5
  require_relative "error"
6
+ require_relative "version"
6
7
  require "rubygems"
8
+ require_relative "../openapi_client"
7
9
 
8
10
  module Passage
9
- App =
10
- Struct.new :name,
11
- :id,
12
- :auth_origin,
13
- :redirect_url,
14
- :login_url,
15
- :rsa_public_key,
16
- :allowed_identifer,
17
- :require_identifier_verification,
18
- :session_timeout_length,
19
- :refresh_enabled,
20
- :refresh_absolute_lifetime,
21
- :refresh_inactivity_lifetime,
22
- :user_metadata_schema,
23
- :layouts,
24
- :default_language,
25
- :auth_fallback_method,
26
- :auth_fallback_method_ttl,
27
- keyword_init: true
28
-
29
- User =
30
- Struct.new :id,
31
- :status,
32
- :email,
33
- :phone,
34
- :email_verified,
35
- :phone_verified,
36
- :created_at,
37
- :updated_at,
38
- :last_login_at,
39
- :login_count,
40
- :recent_events,
41
- :webauthn,
42
- :webauthn_devices,
43
- :user_metadata,
44
- keyword_init: true
45
- MagicLink =
46
- Struct.new :id,
47
- :secret,
48
- :activated,
49
- :user_id,
50
- :app_id,
51
- :identifier,
52
- :type,
53
- :redirect_url,
54
- :ttl,
55
- :url,
56
- keyword_init: true
57
- Device =
58
- Struct.new :id,
59
- :cred_id,
60
- :friendly_name,
61
- :usage_count,
62
- :updated_at,
63
- :created_at,
64
- :last_login_at,
65
- keyword_init: true
66
-
67
11
  COOKIE_STRATEGY = 0
68
12
  HEADER_STRATEGY = 1
69
13
 
@@ -75,7 +19,6 @@ module Passage
75
19
  attr_reader :user
76
20
 
77
21
  def initialize(app_id:, api_key: "", auth_strategy: COOKIE_STRATEGY)
78
- @api_url = "https://api.passage.id"
79
22
  @app_id = app_id
80
23
  @api_key = api_key
81
24
 
@@ -85,58 +28,17 @@ module Passage
85
28
  end
86
29
  @auth_strategy = auth_strategy
87
30
 
88
- # setup
89
- get_connection
90
-
91
31
  # initialize auth class
92
- @auth = Passage::Auth.new(@app_id, @auth_strategy, @connection)
32
+ @auth = Passage::Auth.new(@app_id, @auth_strategy)
93
33
 
94
34
  # initialize user class
95
- @user = Passage::UserAPI.new(@connection, @app_id, @api_key)
96
- end
97
-
98
- def get_connection
99
- gemspec = File.join(__dir__, "../../passageidentity.gemspec")
100
- spec = Gem::Specification.load(gemspec)
101
- headers = { "Passage-Version" => "passage-ruby #{spec.version}" }
102
- headers["Authorization"] = "Bearer #{@api_key}" if @api_key != ""
103
-
104
- @connection =
105
- Faraday.new(url: @api_url, headers: headers) do |f|
106
- f.request :json
107
- f.request :retry
108
- f.response :raise_error
109
- f.response :json
110
- f.adapter :net_http
111
- end
35
+ @user = Passage::UserAPI.new(@app_id, @api_key)
112
36
  end
113
37
 
114
38
  def get_app()
115
39
  begin
116
- app_info = @auth.fetch_app()
117
- return(
118
- Passage::App.new(
119
- name: app_info["name"],
120
- id: app_info["id"],
121
- auth_origin: app_info["auth_origin"],
122
- redirect_url: app_info["redirect_url"],
123
- login_url: app_info["login_url"],
124
- rsa_public_key: app_info["rsa_public_key"],
125
- allowed_identifer: app_info["allowed_identifer"],
126
- require_identifier_verification:
127
- app_info["require_identifier_verification"],
128
- session_timeout_length: app_info["session_timeout_length"],
129
- refresh_enabled: app_info["refresh_enabled"],
130
- refresh_absolute_lifetime: app_info["refresh_absolute_lifetime"],
131
- refresh_inactivity_lifetime:
132
- app_info["refresh_inactivity_lifetime"],
133
- user_metadata_schema: app_info["user_metadata_schema"],
134
- layouts: app_info["layouts"],
135
- default_language: app_info["default_language"],
136
- auth_fallback_method: app_info["auth_fallback_method"],
137
- auth_fallback_method_ttl: app_info["auth_fallback_method_ttl"]
138
- )
139
- )
40
+ client = OpenapiClient::AppsApi.new
41
+ return client.get_app(@app_id).app
140
42
  rescue => e
141
43
  raise e
142
44
  end
@@ -176,23 +78,17 @@ module Passage
176
78
  magic_link_req["type"] = type
177
79
 
178
80
  begin
179
- response =
180
- @connection.post("/v1/apps/#{@app_id}/magic-links", magic_link_req)
181
- magic_link = response.body["magic_link"]
182
- return(
183
- Passage::MagicLink.new(
184
- id: magic_link["id"],
185
- secret: magic_link["secret"],
186
- activated: magic_link["activated"],
187
- user_id: magic_link["user_id"],
188
- app_id: magic_link["app_id"],
189
- identifier: magic_link["identifier"],
190
- type: magic_link["type"],
191
- redirect_url: magic_link["redirect_url"],
192
- ttl: magic_link["ttl"],
193
- url: magic_link["url"]
194
- )
195
- )
81
+ gemspec = File.join(__dir__, "../../passageidentity.gemspec")
82
+ spec = Gem::Specification.load(gemspec)
83
+ header_params = { "Passage-Version" => "passage-ruby #{Passage::VERSION}" }
84
+ header_params["Authorization"] = "Bearer #{@api_key}" if @api_key != ""
85
+
86
+ opts = {}
87
+ opts[:header_params] = header_params
88
+ opts[:debug_auth_names] = ["header"]
89
+
90
+ client = OpenapiClient::MagicLinksApi.new
91
+ return client.create_magic_link(@app_id, magic_link_req, opts).magic_link
196
92
  rescue Faraday::Error => e
197
93
  raise PassageError.new(
198
94
  message: "failed to create Passage Magic Link",
@@ -3,37 +3,28 @@ require_relative "client"
3
3
  module Passage
4
4
  class UserAPI
5
5
  # This class will require an API key
6
- def initialize(connection, app_id, api_key)
7
- @connection = connection
6
+ def initialize(app_id, api_key)
8
7
  @app_id = app_id
9
8
  @api_key = api_key
9
+ @user_client = OpenapiClient::UsersApi.new
10
+ @user_device_client = OpenapiClient::UserDevicesApi.new
11
+
12
+ header_params = { "Passage-Version" => "passage-ruby #{Passage::VERSION}"}
13
+ header_params["Authorization"] = "Bearer #{@api_key}" if @api_key != ""
14
+
15
+ @req_opts = {}
16
+ @req_opts[:header_params] = header_params
17
+ @req_opts[:debug_auth_names] = ["header"]
18
+
10
19
  end
11
20
 
12
21
  def get(user_id:)
13
22
  user_exists?(user_id)
14
23
 
15
24
  begin
16
- response = @connection.get("/v1/apps/#{@app_id}/users/#{user_id}")
17
- user = response.body["user"]
18
- user.transform_keys(&:to_sym)
19
- return(
20
- Passage::User.new(
21
- id: user["id"],
22
- status: user["status"],
23
- email: user["email"],
24
- phone: user["phone"],
25
- email_verified: user["email_verified"],
26
- phone_verified: user["phone_verified"],
27
- created_at: user["created_at"],
28
- updated_at: user["updated_at"],
29
- last_login_at: user["last_login_at"],
30
- login_count: user["login_count"],
31
- webauthn: user["webauthn"],
32
- webauthn_devices: user["webauthn_devices"],
33
- recent_events: user["recent_events"],
34
- user_metadata: user["user_metadata"]
35
- )
36
- )
25
+ response = @user_client.get_user(@app_id, user_id, @req_opts)
26
+ user = response.user
27
+ return user
37
28
  rescue Faraday::Error => e
38
29
  if e.is_a? Faraday::ResourceNotFound
39
30
  raise PassageError.new(
@@ -55,27 +46,8 @@ module Passage
55
46
  user_exists?(user_id)
56
47
 
57
48
  begin
58
- response =
59
- @connection.patch("/v1/apps/#{@app_id}/users/#{user_id}/activate")
60
- user = response.body["user"]
61
- return(
62
- Passage::User.new(
63
- id: user["id"],
64
- status: user["status"],
65
- email: user["email"],
66
- phone: user["phone"],
67
- email_verified: user["email_verified"],
68
- phone_verified: user["phone_verified"],
69
- created_at: user["created_at"],
70
- updated_at: user["updated_at"],
71
- last_login_at: user["last_login_at"],
72
- login_count: user["login_count"],
73
- webauthn: user["webauthn"],
74
- webauthn_devices: user["webauthn_devices"],
75
- recent_events: user["recent_events"],
76
- user_metadata: user["user_metadata"]
77
- )
78
- )
49
+ response = @user_client.activate_user(@app_id, user_id, @req_opts)
50
+ return response.user
79
51
  rescue Faraday::Error => e
80
52
  if e.is_a? Faraday::ResourceNotFound
81
53
  raise PassageError.new(
@@ -97,27 +69,8 @@ module Passage
97
69
  user_exists?(user_id)
98
70
 
99
71
  begin
100
- response =
101
- @connection.patch("/v1/apps/#{@app_id}/users/#{user_id}/deactivate")
102
- user = response.body["user"]
103
- return(
104
- Passage::User.new(
105
- id: user["id"],
106
- status: user["status"],
107
- email: user["email"],
108
- phone: user["phone"],
109
- email_verified: user["email_verified"],
110
- phone_verified: user["phone_verified"],
111
- created_at: user["created_at"],
112
- updated_at: user["updated_at"],
113
- last_login_at: user["last_login_at"],
114
- login_count: user["login_count"],
115
- webauthn: user["webauthn"],
116
- webauthn_devices: user["webauthn_devices"],
117
- recent_events: user["recent_events"],
118
- user_metadata: user["user_metadata"]
119
- )
120
- )
72
+ response = @user_client.deactivate_user(@app_id, user_id, @req_opts)
73
+ return response.user
121
74
  rescue Faraday::Error => e
122
75
  if e.is_a? Faraday::ResourceNotFound
123
76
  raise PassageError.new(
@@ -143,27 +96,8 @@ module Passage
143
96
  updates["phone"] = phone unless phone.empty?
144
97
  updates["user_metadata"] = user_metadata unless user_metadata.empty?
145
98
  begin
146
- response =
147
- @connection.patch("/v1/apps/#{@app_id}/users/#{user_id}", updates)
148
- user = response.body["user"]
149
- return(
150
- Passage::User.new(
151
- id: user["id"],
152
- status: user["status"],
153
- email: user["email"],
154
- phone: user["phone"],
155
- email_verified: user["email_verified"],
156
- phone_verified: user["phone_verified"],
157
- created_at: user["created_at"],
158
- updated_at: user["updated_at"],
159
- last_login_at: user["last_login_at"],
160
- login_count: user["login_count"],
161
- webauthn: user["webauthn"],
162
- webauthn_devices: user["webauthn_devices"],
163
- recent_events: user["recent_events"],
164
- user_metadata: user["user_metadata"]
165
- )
166
- )
99
+ response = @user_client.update_user(@app_id, user_id, updates, @req_opts)
100
+ return response.user
167
101
  rescue Faraday::Error => e
168
102
  if e.is_a? Faraday::ResourceNotFound
169
103
  raise PassageError.new(
@@ -187,26 +121,8 @@ module Passage
187
121
  create["phone"] = phone unless phone.empty?
188
122
  create["user_metadata"] = user_metadata unless user_metadata.empty?
189
123
  begin
190
- response = @connection.post("/v1/apps/#{@app_id}/users", create)
191
- user = response.body["user"]
192
- return(
193
- Passage::User.new(
194
- id: user["id"],
195
- status: user["status"],
196
- email: user["email"],
197
- phone: user["phone"],
198
- email_verified: user["email_verified"],
199
- phone_verified: user["phone_verified"],
200
- created_at: user["created_at"],
201
- updated_at: user["updated_at"],
202
- last_login_at: user["last_login_at"],
203
- login_count: user["login_count"],
204
- webauthn: user["webauthn"],
205
- webauthn_devices: user["webauthn_devices"],
206
- recent_events: user["recent_events"],
207
- user_metadata: user["user_metadata"]
208
- )
209
- )
124
+ response = @user_client.create_user(@app_id, create, @req_opts)
125
+ return response.user
210
126
  rescue Faraday::Error => e
211
127
  raise PassageError.new(
212
128
  "failed to create Passage User",
@@ -220,7 +136,7 @@ module Passage
220
136
  user_exists?(user_id)
221
137
 
222
138
  begin
223
- response = @connection.delete("/v1/apps/#{@app_id}/users/#{user_id}")
139
+ response = @user_client.delete_user(@app_id, user_id, @req_opts)
224
140
  return true
225
141
  rescue Faraday::Error => e
226
142
  if e.is_a? Faraday::ResourceNotFound
@@ -244,10 +160,7 @@ module Passage
244
160
  device_exists?(device_id)
245
161
 
246
162
  begin
247
- response =
248
- @connection.delete(
249
- "/v1/apps/#{@app_id}/users/#{user_id}/devices/#{device_id}"
250
- )
163
+ response = @user_device_client.delete_user_devices(@app_id, user_id, device_id, @req_opts)
251
164
  return true
252
165
  rescue Faraday::Error => e
253
166
  raise PassageError.new(
@@ -262,24 +175,8 @@ module Passage
262
175
  user_exists?(user_id)
263
176
 
264
177
  begin
265
- response =
266
- @connection.get("/v1/apps/#{@app_id}/users/#{user_id}/devices")
267
- devicesResp = response.body["devices"]
268
- devices = Array.new
269
- devicesResp.each do |device|
270
- devices.append(
271
- Passage::Device.new(
272
- id: device["id"],
273
- cred_id: device["cred_id"],
274
- friendly_name: device["friendly_name"],
275
- usage_count: device["usage_count"],
276
- updated_at: device["updated_at"],
277
- created_at: device["created_at"],
278
- last_login_at: device["last_login_at"]
279
- )
280
- )
281
- end
282
- return devices
178
+ response = @user_device_client.list_user_devices(@app_id, user_id, @req_opts)
179
+ return response.devices
283
180
  rescue Faraday::Error => e
284
181
  raise PassageError.new(
285
182
  "failed to delete Passage User Device",
@@ -290,10 +187,11 @@ module Passage
290
187
  end
291
188
 
292
189
  def signout(user_id:)
190
+ warn "[DEPRECATION] `user.signout()` is deprecated. Please use `auth.revoke_user_refresh_tokens()` instead."
293
191
  user_exists?(user_id)
294
192
  begin
295
- response =
296
- @connection.delete("/v1/apps/#{@app_id}/users/#{user_id}/tokens/")
193
+ tokens_client = OpenapiClient::TokensApi.new
194
+ response = tokens_client.revoke_user_refresh_tokens(@app_id, user_id, @req_opts)
297
195
  return true
298
196
  rescue Faraday::Error => e
299
197
  raise PassageError.new(
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Passage
4
+ VERSION = '0.3.0'
5
+ end
data/openapitools.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json",
3
+ "spaces": 2,
4
+ "generator-cli": {
5
+ "version": "7.1.0"
6
+ }
7
+ }
@@ -1,6 +1,8 @@
1
+ require_relative 'lib/passageidentity/version'
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = 'passageidentity'
3
- s.version = '0.2.3'
5
+ s.version = Passage::VERSION
4
6
  s.summary = 'Passage SDK for biometric authentication'
5
7
  s.description =
6
8
  'Enables verification of server-side authentication and user management for applications using Passage'
data/tests/auth_test.rb CHANGED
@@ -5,7 +5,7 @@ require "rack"
5
5
  require "test/unit"
6
6
 
7
7
  Dotenv.load(".env")
8
- class TestUserAPI < Test::Unit::TestCase
8
+ class TestAuthAPI < Test::Unit::TestCase
9
9
  PassageClient =
10
10
  Passage::Client.new(app_id: ENV["APP_ID"], api_key: ENV["API_KEY"])
11
11
  PassageHeaderClient =
@@ -15,6 +15,11 @@ class TestUserAPI < Test::Unit::TestCase
15
15
  auth_strategy: Passage::HEADER_STRATEGY
16
16
  )
17
17
 
18
+ def test_valid_jwt
19
+ user_id = PassageClient.auth.validate_jwt(ENV["PSG_JWT"])
20
+ assert_equal ENV["TEST_USER_ID"], user_id
21
+ end
22
+
18
23
  def test_valid_authenticate_token
19
24
  user_id = PassageClient.auth.authenticate_token(ENV["PSG_JWT"])
20
25
  assert_equal ENV["TEST_USER_ID"], user_id
@@ -4,18 +4,19 @@ require "faraday"
4
4
  require "test/unit"
5
5
 
6
6
  Dotenv.load(".env")
7
- class TestUserAPI < Test::Unit::TestCase
7
+ class TestMagicLinkAPI < Test::Unit::TestCase
8
8
  PassageClient =
9
9
  Passage::Client.new(app_id: ENV["APP_ID"], api_key: ENV["API_KEY"])
10
10
 
11
- def test_create_magi_link()
11
+ def test_create_magic_link()
12
12
  magic_link =
13
13
  PassageClient.create_magic_link(
14
14
  email: "chris@passage.id",
15
15
  channel: Passage::EMAIL_CHANNEL,
16
- ttl: 12
16
+ ttl: 122
17
17
  )
18
- assert_equal 12, magic_link.ttl
18
+
19
+ assert_equal 122, magic_link.ttl
19
20
  assert_equal "chris@passage.id", magic_link.identifier
20
21
  end
21
22
  end
@@ -27,7 +27,7 @@ class TestUserAPI < Test::Unit::TestCase
27
27
  }
28
28
  )
29
29
  assert_equal "chris+test-create-delete@passage.id", user.email
30
- assert_equal "cool", user.user_metadata["example1"]
30
+ assert_equal "cool", user.user_metadata[:example1]
31
31
  deleted = PassageClient.user.delete(user_id: user.id)
32
32
  assert_equal true, deleted
33
33
  end
@@ -61,7 +61,7 @@ class TestUserAPI < Test::Unit::TestCase
61
61
  )
62
62
  assert_equal $global_test_user.id, user.id
63
63
  assert_equal new_email, user.email
64
- assert_equal "lame", user.user_metadata["example1"]
64
+ assert_equal "lame", user.user_metadata[:example1]
65
65
  end
66
66
 
67
67
  def test_list_devices()