better_auth 0.2.0 → 0.3.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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +5 -3
  4. data/lib/better_auth/adapters/internal_adapter.rb +168 -18
  5. data/lib/better_auth/adapters/memory.rb +4 -1
  6. data/lib/better_auth/adapters/mongodb.rb +5 -365
  7. data/lib/better_auth/adapters/sql.rb +17 -1
  8. data/lib/better_auth/api.rb +1 -1
  9. data/lib/better_auth/context.rb +2 -1
  10. data/lib/better_auth/plugin.rb +14 -1
  11. data/lib/better_auth/plugins/oauth_protocol.rb +403 -57
  12. data/lib/better_auth/plugins/organization.rb +5 -0
  13. data/lib/better_auth/rate_limiter.rb +19 -2
  14. data/lib/better_auth/router.rb +14 -1
  15. data/lib/better_auth/routes/email_verification.rb +5 -2
  16. data/lib/better_auth/routes/password.rb +19 -0
  17. data/lib/better_auth/routes/session.rb +27 -4
  18. data/lib/better_auth/routes/sign_in.rb +1 -1
  19. data/lib/better_auth/routes/sign_up.rb +52 -1
  20. data/lib/better_auth/routes/social.rb +201 -22
  21. data/lib/better_auth/routes/user.rb +14 -2
  22. data/lib/better_auth/schema/sql.rb +11 -0
  23. data/lib/better_auth/schema.rb +16 -0
  24. data/lib/better_auth/social_providers/apple.rb +44 -8
  25. data/lib/better_auth/social_providers/atlassian.rb +32 -0
  26. data/lib/better_auth/social_providers/base.rb +262 -4
  27. data/lib/better_auth/social_providers/cognito.rb +32 -0
  28. data/lib/better_auth/social_providers/discord.rb +27 -5
  29. data/lib/better_auth/social_providers/dropbox.rb +33 -0
  30. data/lib/better_auth/social_providers/facebook.rb +35 -0
  31. data/lib/better_auth/social_providers/figma.rb +31 -0
  32. data/lib/better_auth/social_providers/github.rb +21 -6
  33. data/lib/better_auth/social_providers/gitlab.rb +16 -3
  34. data/lib/better_auth/social_providers/google.rb +38 -13
  35. data/lib/better_auth/social_providers/huggingface.rb +31 -0
  36. data/lib/better_auth/social_providers/kakao.rb +32 -0
  37. data/lib/better_auth/social_providers/kick.rb +32 -0
  38. data/lib/better_auth/social_providers/line.rb +33 -0
  39. data/lib/better_auth/social_providers/linear.rb +44 -0
  40. data/lib/better_auth/social_providers/linkedin.rb +30 -0
  41. data/lib/better_auth/social_providers/microsoft_entra_id.rb +79 -7
  42. data/lib/better_auth/social_providers/naver.rb +31 -0
  43. data/lib/better_auth/social_providers/notion.rb +33 -0
  44. data/lib/better_auth/social_providers/paybin.rb +31 -0
  45. data/lib/better_auth/social_providers/paypal.rb +36 -0
  46. data/lib/better_auth/social_providers/polar.rb +31 -0
  47. data/lib/better_auth/social_providers/railway.rb +49 -0
  48. data/lib/better_auth/social_providers/reddit.rb +32 -0
  49. data/lib/better_auth/social_providers/roblox.rb +31 -0
  50. data/lib/better_auth/social_providers/salesforce.rb +38 -0
  51. data/lib/better_auth/social_providers/slack.rb +30 -0
  52. data/lib/better_auth/social_providers/spotify.rb +31 -0
  53. data/lib/better_auth/social_providers/tiktok.rb +35 -0
  54. data/lib/better_auth/social_providers/twitch.rb +39 -0
  55. data/lib/better_auth/social_providers/twitter.rb +32 -0
  56. data/lib/better_auth/social_providers/vercel.rb +47 -0
  57. data/lib/better_auth/social_providers/vk.rb +34 -0
  58. data/lib/better_auth/social_providers/wechat.rb +104 -0
  59. data/lib/better_auth/social_providers/zoom.rb +31 -0
  60. data/lib/better_auth/social_providers.rb +29 -0
  61. data/lib/better_auth/version.rb +1 -1
  62. data/lib/better_auth.rb +0 -1
  63. metadata +30 -15
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterAuth
4
+ module SocialProviders
5
+ module_function
6
+
7
+ def wechat(client_id:, client_secret:, scopes: ["snsapi_login"], **options)
8
+ normalized = Base.normalize_options(options)
9
+ provider = Base.oauth_provider(
10
+ id: "wechat",
11
+ name: "WeChat",
12
+ client_id: client_id,
13
+ client_secret: client_secret,
14
+ authorization_endpoint: "https://open.weixin.qq.com/connect/qrconnect",
15
+ token_endpoint: "https://api.weixin.qq.com/sns/oauth2/access_token",
16
+ user_info_endpoint: "https://api.weixin.qq.com/sns/userinfo",
17
+ scopes: scopes,
18
+ scope_separator: ",",
19
+ profile_map: ->(profile) {
20
+ {
21
+ id: profile["unionid"] || profile["openid"],
22
+ name: profile["nickname"],
23
+ email: profile["email"],
24
+ image: profile["headimgurl"],
25
+ emailVerified: false
26
+ }
27
+ },
28
+ **options
29
+ )
30
+ provider[:create_authorization_url] = lambda do |data|
31
+ "#{Base.authorization_url("https://open.weixin.qq.com/connect/qrconnect", {
32
+ appid: client_id,
33
+ redirect_uri: normalized[:redirect_uri] || data[:redirect_uri] || data[:redirectURI],
34
+ response_type: "code",
35
+ scope: Base.selected_scopes(scopes, normalized, data).join(","),
36
+ state: data[:state],
37
+ lang: options[:lang] || "cn"
38
+ })}#wechat_redirect"
39
+ end
40
+ provider[:validate_authorization_code] = lambda do |data|
41
+ url = Base.authorization_url("https://api.weixin.qq.com/sns/oauth2/access_token", {
42
+ appid: client_id,
43
+ secret: client_secret,
44
+ code: data[:code],
45
+ grant_type: "authorization_code"
46
+ })
47
+ payload = Base.get_json(url)
48
+ if !payload || payload["errcode"]
49
+ raise Error, "Failed to validate authorization code: #{payload&.fetch("errmsg", nil) || "Unknown error"}"
50
+ end
51
+
52
+ Base.normalize_tokens(payload).merge(
53
+ "openid" => payload["openid"],
54
+ "unionid" => payload["unionid"]
55
+ ).compact
56
+ end
57
+ provider[:refresh_access_token] = normalized[:refresh_access_token] || lambda do |refresh_token|
58
+ url = Base.authorization_url("https://api.weixin.qq.com/sns/oauth2/refresh_token", {
59
+ appid: client_id,
60
+ grant_type: "refresh_token",
61
+ refresh_token: refresh_token
62
+ })
63
+ payload = Base.get_json(url)
64
+ if !payload || payload["errcode"]
65
+ raise Error, "Failed to refresh access token: #{payload&.fetch("errmsg", nil) || "Unknown error"}"
66
+ end
67
+
68
+ Base.normalize_tokens(payload).merge(
69
+ "openid" => payload["openid"],
70
+ "unionid" => payload["unionid"]
71
+ ).compact
72
+ end
73
+ provider[:get_user_info] = lambda do |tokens|
74
+ custom = normalized[:get_user_info]
75
+ next custom.call(tokens) if custom
76
+
77
+ openid = tokens["openid"] || tokens[:openid]
78
+ next nil if openid.to_s.empty?
79
+
80
+ url = Base.authorization_url("https://api.weixin.qq.com/sns/userinfo", {
81
+ access_token: Base.access_token(tokens),
82
+ openid: openid,
83
+ lang: "zh_CN"
84
+ })
85
+ profile = Base.get_json(url)
86
+ next nil if !profile || profile["errcode"]
87
+
88
+ user = Base.apply_profile_mapping(
89
+ {
90
+ id: profile["unionid"] || profile["openid"] || openid,
91
+ name: profile["nickname"],
92
+ email: profile["email"],
93
+ image: profile["headimgurl"],
94
+ emailVerified: false
95
+ },
96
+ profile,
97
+ normalized
98
+ )
99
+ {user: user, data: profile}
100
+ end
101
+ provider
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BetterAuth
4
+ module SocialProviders
5
+ module_function
6
+
7
+ def zoom(client_id:, client_secret:, scopes: [], **options)
8
+ Base.oauth_provider(
9
+ id: "zoom",
10
+ name: "Zoom",
11
+ client_id: client_id,
12
+ client_secret: client_secret,
13
+ authorization_endpoint: "https://zoom.us/oauth/authorize",
14
+ token_endpoint: "https://zoom.us/oauth/token",
15
+ user_info_endpoint: "https://api.zoom.us/v2/users/me",
16
+ scopes: scopes,
17
+ pkce: options.fetch(:pkce, true),
18
+ profile_map: ->(profile) {
19
+ {
20
+ id: profile["id"],
21
+ name: profile["display_name"],
22
+ email: profile["email"],
23
+ image: profile["pic_url"],
24
+ emailVerified: !!profile["verified"]
25
+ }
26
+ },
27
+ **options
28
+ )
29
+ end
30
+ end
31
+ end
@@ -7,3 +7,32 @@ require_relative "social_providers/gitlab"
7
7
  require_relative "social_providers/discord"
8
8
  require_relative "social_providers/apple"
9
9
  require_relative "social_providers/microsoft_entra_id"
10
+ require_relative "social_providers/atlassian"
11
+ require_relative "social_providers/cognito"
12
+ require_relative "social_providers/dropbox"
13
+ require_relative "social_providers/facebook"
14
+ require_relative "social_providers/figma"
15
+ require_relative "social_providers/huggingface"
16
+ require_relative "social_providers/kakao"
17
+ require_relative "social_providers/kick"
18
+ require_relative "social_providers/line"
19
+ require_relative "social_providers/linear"
20
+ require_relative "social_providers/linkedin"
21
+ require_relative "social_providers/naver"
22
+ require_relative "social_providers/notion"
23
+ require_relative "social_providers/paybin"
24
+ require_relative "social_providers/paypal"
25
+ require_relative "social_providers/polar"
26
+ require_relative "social_providers/railway"
27
+ require_relative "social_providers/reddit"
28
+ require_relative "social_providers/roblox"
29
+ require_relative "social_providers/salesforce"
30
+ require_relative "social_providers/slack"
31
+ require_relative "social_providers/spotify"
32
+ require_relative "social_providers/tiktok"
33
+ require_relative "social_providers/twitch"
34
+ require_relative "social_providers/twitter"
35
+ require_relative "social_providers/vercel"
36
+ require_relative "social_providers/vk"
37
+ require_relative "social_providers/wechat"
38
+ require_relative "social_providers/zoom"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BetterAuth
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/better_auth.rb CHANGED
@@ -17,7 +17,6 @@ require_relative "better_auth/adapters/postgres"
17
17
  require_relative "better_auth/adapters/mysql"
18
18
  require_relative "better_auth/adapters/sqlite"
19
19
  require_relative "better_auth/adapters/mssql"
20
- require_relative "better_auth/adapters/mongodb"
21
20
  require_relative "better_auth/database_hooks"
22
21
  require_relative "better_auth/adapters/internal_adapter"
23
22
  require_relative "better_auth/context"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_auth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Sala
@@ -217,20 +217,6 @@ dependencies:
217
217
  - - "~>"
218
218
  - !ruby/object:Gem::Version
219
219
  version: '2.0'
220
- - !ruby/object:Gem::Dependency
221
- name: mongo
222
- requirement: !ruby/object:Gem::Requirement
223
- requirements:
224
- - - "~>"
225
- - !ruby/object:Gem::Version
226
- version: '2.21'
227
- type: :development
228
- prerelease: false
229
- version_requirements: !ruby/object:Gem::Requirement
230
- requirements:
231
- - - "~>"
232
- - !ruby/object:Gem::Version
233
- version: '2.21'
234
220
  - !ruby/object:Gem::Dependency
235
221
  name: sequel
236
222
  requirement: !ruby/object:Gem::Requirement
@@ -354,12 +340,41 @@ files:
354
340
  - lib/better_auth/session_store.rb
355
341
  - lib/better_auth/social_providers.rb
356
342
  - lib/better_auth/social_providers/apple.rb
343
+ - lib/better_auth/social_providers/atlassian.rb
357
344
  - lib/better_auth/social_providers/base.rb
345
+ - lib/better_auth/social_providers/cognito.rb
358
346
  - lib/better_auth/social_providers/discord.rb
347
+ - lib/better_auth/social_providers/dropbox.rb
348
+ - lib/better_auth/social_providers/facebook.rb
349
+ - lib/better_auth/social_providers/figma.rb
359
350
  - lib/better_auth/social_providers/github.rb
360
351
  - lib/better_auth/social_providers/gitlab.rb
361
352
  - lib/better_auth/social_providers/google.rb
353
+ - lib/better_auth/social_providers/huggingface.rb
354
+ - lib/better_auth/social_providers/kakao.rb
355
+ - lib/better_auth/social_providers/kick.rb
356
+ - lib/better_auth/social_providers/line.rb
357
+ - lib/better_auth/social_providers/linear.rb
358
+ - lib/better_auth/social_providers/linkedin.rb
362
359
  - lib/better_auth/social_providers/microsoft_entra_id.rb
360
+ - lib/better_auth/social_providers/naver.rb
361
+ - lib/better_auth/social_providers/notion.rb
362
+ - lib/better_auth/social_providers/paybin.rb
363
+ - lib/better_auth/social_providers/paypal.rb
364
+ - lib/better_auth/social_providers/polar.rb
365
+ - lib/better_auth/social_providers/railway.rb
366
+ - lib/better_auth/social_providers/reddit.rb
367
+ - lib/better_auth/social_providers/roblox.rb
368
+ - lib/better_auth/social_providers/salesforce.rb
369
+ - lib/better_auth/social_providers/slack.rb
370
+ - lib/better_auth/social_providers/spotify.rb
371
+ - lib/better_auth/social_providers/tiktok.rb
372
+ - lib/better_auth/social_providers/twitch.rb
373
+ - lib/better_auth/social_providers/twitter.rb
374
+ - lib/better_auth/social_providers/vercel.rb
375
+ - lib/better_auth/social_providers/vk.rb
376
+ - lib/better_auth/social_providers/wechat.rb
377
+ - lib/better_auth/social_providers/zoom.rb
363
378
  - lib/better_auth/version.rb
364
379
  homepage: https://github.com/sebasxsala/better-auth
365
380
  licenses: