omniauth-ethereum 0.0.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/omniauth-ethereum.rb +69 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 6947c484fefdc343cb442e3d34f8fbbba0f4ac877048fef87cc4ba2adba7dfec
4
+ data.tar.gz: 407145e7efecc556eca441957b950bc69e5c70b0f326694876e91349e96f9fce
5
+ SHA512:
6
+ metadata.gz: a2044f7abf6b20972f3bf5eed4f54ab735fd4aa33ea38824584270bb6d8a99f3c67603f03b169e96c02627d7770fb0645208cfb029adaac3cf1574de0fed4f0c
7
+ data.tar.gz: 3e2115d0a251336dd0cd4afd92f5373702cde207c8517bf0bf1c8cc044e036efb5b7285891f5d56084bb1fbc397248c12747bef3df8a0d3716ee70e77336d989
@@ -0,0 +1,69 @@
1
+ require 'omniauth'
2
+ require 'eth'
3
+
4
+ module OmniAuth
5
+ module Strategies
6
+ class Ethereum
7
+ include OmniAuth::Strategy
8
+
9
+ # ethereum authentication strategy fields
10
+ # `eth_message`: contains a custom string, the request time, and the specific nonce to sign
11
+ # `eth_address`: contains the public Eth::Address of the user's Ethereum account
12
+ # `eth_signature`: contains the signature of the `eth_message` signed by `eth_address`
13
+ option :fields, [:eth_message, :eth_address, :eth_signature]
14
+
15
+ # the `eth_address` will be the _fake_ unique identifier for the Ethereum strategy
16
+ option :uid_field, :eth_address
17
+ option :fields, [:eth_message, :eth_address, :eth_signature]
18
+ option :uid_field, :eth_address
19
+
20
+ def request_phase
21
+ form = OmniAuth::Form.new :title => 'Ethereum Authentication', :url => callback_path
22
+ options.fields.each do |field|
23
+
24
+ # these fields are read-only and will be filled by javascript in the process
25
+ if field == :eth_message
26
+ form.html("<input type='hidden' id='eth_message' name='eth_message' value='#{now}' />")
27
+ else
28
+ form.html("<input type='hidden' id='#{field.to_s}' name='#{field.to_s}' />")
29
+ end
30
+ end
31
+
32
+ # the form button will be heavy on javascript, requesting account, nonce, and signature before submission
33
+ form.button 'Sign In'
34
+ path = File.join( File.dirname(__FILE__), 'new_session.js')
35
+ js = File.read(path)
36
+ mod = "<script type='module'>\n#{js}\n</script>"
37
+
38
+ form.html(mod)
39
+ form.to_response
40
+ end
41
+
42
+ def callback_phase
43
+ address = request.params['eth_address'].downcase
44
+ message = request.params['eth_message']
45
+ signature = request.params['eth_signature']
46
+ signature_pubkey = Eth::Key.personal_recover message, signature
47
+ signature_address = (Eth::Utils.public_key_to_address signature_pubkey).downcase
48
+
49
+ unix_time = message.scan(/\d+/).first.to_i
50
+ ten_min = 10 * 60
51
+ return fail!(:invalid_time) unless unix_time + ten_min >= now && unix_time - ten_min <= now
52
+
53
+ return fail!(:invalid_credentials) unless signature_address == address
54
+
55
+ super
56
+ end
57
+
58
+ uid do
59
+ request.params[options.uid_field.to_s]
60
+ end
61
+
62
+ private
63
+
64
+ def now
65
+ Time.now.utc.to_i
66
+ end
67
+ end
68
+ end
69
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: omniauth-ethereum
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Afri Schoedon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-11-18 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Authentication Strategy for OmniAuth to authenticate a user with an Ethereum
14
+ account
15
+ email: gems@fault.dev
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/omniauth-ethereum.rb
21
+ homepage: https://github.com/byz-f/omniauth-ethereum
22
+ licenses:
23
+ - Apache-2.0
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.2.29
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: OmniAuth Strategy for Ethereum
44
+ test_files: []