authlogic_vkontakte 0.1.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.
@@ -0,0 +1,11 @@
1
+ README.rdoc
2
+ Rakefile
3
+ authlogic_vkontakte.gemspec
4
+ init.rb
5
+ js/vkontakte.js
6
+ lib/profile_loader.rb
7
+ lib/settings.rb
8
+ lib/tasks/vkontakte.rake
9
+ lib/vkontakte_authentication.rb
10
+ lib/vkontakte_helper.rb
11
+ Manifest
@@ -0,0 +1,50 @@
1
+ Bind vkontakte authentication to your authlogic project.
2
+ == Install
3
+ gem install authlogic_vkontakte
4
+
5
+ == Setup
6
+ Run rake task to init resources (javascripts and other)
7
+ rake vkontakte:init
8
+
9
+ Edit vkontakte.yml file in your project directory
10
+ vk_app_id: <YOUR_APP_ID>
11
+ vk_app_password: <YOUR_PASSWORD>
12
+
13
+ Create migration like this one:
14
+ class AddVkontakteIdToUser < ActiveRecord::Migration
15
+ def self.up
16
+ add_column :users, :vk_id, :string
17
+ end
18
+
19
+ def self.down
20
+ remove_column :users, :vk_id
21
+ end
22
+ end
23
+
24
+ Add "vontakte_authentication" to your User model
25
+ class User < ActiveRecord::Base
26
+ vkontakte_authentication
27
+ end
28
+ And a little requirement now - jQuery (see vkontakte.js) for posting to "create" action of UserSessionController. But
29
+ you can use Ajax.Request if you prefer Prototype. And so, TODO is to create version independent of the javascript framework.
30
+
31
+ == Usage
32
+ To include javascript file in layout:
33
+ <%= vkontakte_javascript_include_tag %>
34
+
35
+ Creating "vk_api_transport" 'div' and initializing OpenAPI:
36
+ <%= vkontakte_init_tag %>
37
+
38
+ To add Vkontakte button to your page, simply write this in view:
39
+ <%= vk_login_button %>
40
+
41
+ or, in haml
42
+ = vk_login_button
43
+ In your controller (UserSession):
44
+ def create
45
+ @user_session = UserSession.new(params[:status] ? cookies : params[:user_session])
46
+ if @user_session.save
47
+ ..
48
+ ...and you're in Vkontakte!
49
+
50
+
@@ -0,0 +1,14 @@
1
+ require "rubygems"
2
+ require "rake"
3
+ require "echoe"
4
+
5
+ Echoe.new("authlogic_vkontakte", "0.1.0") do |p|
6
+ p.description= "Bind vkontakte authentication to your authlogic project"
7
+ p.url= "http://github.com/GarPit/authlogic_vkontakte"
8
+ p.author= "Igor Petrov"
9
+ p.email= "garik.piton@gmail.com"
10
+ p.ignore_pattern= ["tmp/*", "script/*", ".idea/*"]
11
+ p.development_dependencies= []
12
+ end
13
+
14
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext}
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{authlogic_vkontakte}
5
+ s.version = "0.1.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Igor Petrov"]
9
+ s.date = %q{2010-10-15}
10
+ s.description = %q{Bind vkontakte authentication to your authlogic project}
11
+ s.email = %q{garik.piton@gmail.com}
12
+ s.extra_rdoc_files = ["README.rdoc", "lib/profile_loader.rb", "lib/settings.rb", "lib/tasks/vkontakte.rake", "lib/vkontakte_authentication.rb", "lib/vkontakte_helper.rb"]
13
+ s.files = ["README.rdoc", "Rakefile", "authlogic_vkontakte.gemspec", "init.rb", "js/vkontakte.js", "lib/profile_loader.rb", "lib/settings.rb", "lib/tasks/vkontakte.rake", "lib/vkontakte_authentication.rb", "lib/vkontakte_helper.rb", "Manifest"]
14
+ s.homepage = %q{http://github.com/GarPit/authlogic_vkontakte}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Authlogic_vkontakte", "--main", "README.rdoc"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{authlogic_vkontakte}
18
+ s.rubygems_version = %q{1.3.7}
19
+ s.summary = %q{Bind vkontakte authentication to your authlogic project}
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 3
24
+
25
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
26
+ else
27
+ end
28
+ else
29
+ end
30
+ end
data/init.rb ADDED
@@ -0,0 +1,3 @@
1
+ require "vkontakte_authentication"
2
+ require "vkontakte_helper"
3
+ ActionView::Base.send :include, VkontakteAuthentication::Helper
@@ -0,0 +1,36 @@
1
+ function init(id)
2
+ {
3
+ window.vkAsyncInit = function() {
4
+ VK.init({
5
+ apiId: id,
6
+ nameTransportPath: '/xd_receiver.html'
7
+ });
8
+ VK.UI.button('vk_login');
9
+ };
10
+ (function() {
11
+ var el = document.createElement("script");
12
+ el.type = "text/javascript";
13
+ el.charset = "windows-1251";
14
+ el.src = "http://vkontakte.ru/js/api/openapi.js";
15
+ el.async = true;
16
+ document.getElementById("vk_api_transport").appendChild(el);
17
+ }());
18
+ }
19
+
20
+
21
+ function doLogin() {
22
+ VK.Auth.login(
23
+ loginInternal,
24
+ VK.access.FRIENDS | VK.access.WIKI
25
+ );
26
+
27
+ }
28
+ function doLogout() {
29
+ VK.Auth.logout(logoutOpenAPI);
30
+ }
31
+
32
+ function loginInternal(response)
33
+ {
34
+ $.post("/user_session", response, "script" );
35
+ return false;
36
+ }
@@ -0,0 +1,42 @@
1
+ module VkontakteAuthentication
2
+
3
+ class YmlLoadError < StandardError; end
4
+ class NoSettingsError < StandardError; end
5
+
6
+ class ProfileLoader
7
+
8
+ def initialize
9
+ @vkontakte_yml = nil
10
+ end
11
+
12
+ def vkontakte_yml_defined?
13
+ vkontakte_file && File.exist?(vkontakte_file)
14
+ end
15
+
16
+ def param(key)
17
+ vkontakte_yml[key.to_s]
18
+ end
19
+
20
+ private
21
+
22
+ def vkontakte_yml
23
+ return @vkontakte_yml if @vkontakte_yml
24
+ unless vkontakte_yml_defined?
25
+ raise(NoSettingsError,"vkontakte.yml was not found.\n")
26
+ end
27
+
28
+ require "yaml"
29
+
30
+ begin
31
+ @vkontakte_yml = YAML.load_file(vkontakte_file)
32
+ rescue StandardError => e
33
+ raise(YmlLoadError,"vkontakte.yml was found, but could not be parsed.\n")
34
+ end
35
+ end
36
+
37
+ def vkontakte_file
38
+ @vkontakte_file ||= Dir.glob('{,.config/,config/}vkontakte{.yml,.yaml}').first
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,21 @@
1
+ module VkontakteAuthentication
2
+
3
+ module Settings
4
+ def profile_loader
5
+ @profile_loader ||= ProfileLoader.new
6
+ end
7
+
8
+ def vk_app_id
9
+ @vk_app_id ||= profile_loader.param(:vk_app_id)
10
+ end
11
+
12
+ def vk_app_password
13
+ @vk_app_password ||= profile_loader.param(:vk_app_password)
14
+ end
15
+
16
+ def vk_app_cookie
17
+ 'vk_app_' + vk_app_id.to_s
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,22 @@
1
+ namespace :vkontakte do
2
+ desc "Init resources for plugin"
3
+ task :init => [:yml, :javascripts]
4
+
5
+ desc "Copy vkontakte.yml to current rails application"
6
+ task :yml do
7
+ puts "Copying YAML file..."
8
+ project_dir = RAILS_ROOT
9
+ yml = File.join(File.dirname(__FILE__), '..', '..', 'vkontakte.yml')
10
+ FileUtils.cp(yml, project_dir)
11
+ puts "vkontakte.yml copied successfully!"
12
+ end
13
+
14
+ desc "Copy javascript to current rails application"
15
+ task :javascripts do
16
+ puts "Copying javascript files..."
17
+ project_dir = RAILS_ROOT + '/public/javascripts/'
18
+ scripts = Dir[File.join(File.dirname(__FILE__), '..', '..', '/js/', '*.js')]
19
+ FileUtils.cp(scripts, project_dir)
20
+ puts "Files copied successfully!"
21
+ end
22
+ end
@@ -0,0 +1,94 @@
1
+ require "profile_loader"
2
+ require "settings"
3
+ require "md5"
4
+
5
+ module VkontakteAuthentication
6
+
7
+ class NotInitializedError < StandardError;
8
+ end
9
+
10
+ module ClassMethods
11
+ include Settings
12
+
13
+ def find_by_vk_id_method(value = nil)
14
+ rw_config(:find_by_vk_id_method, value, "find_by_vk_id")
15
+ end
16
+ alias_method :find_by_vk_id_method=, :find_by_vk_id_method
17
+
18
+ def vk_id_field(value = nil)
19
+ rw_config(:vk_id_field, value, :vk_id)
20
+ end
21
+ alias_method :vk_id_field=, :vk_id_field
22
+
23
+ def vkontakte_authentication
24
+ raise(NotInitializedError, "create and initialize vkontakte.yml") unless profile_loader.vkontakte_yml_defined? && vk_app_id && vk_app_password
25
+ end
26
+
27
+ end
28
+
29
+ module InstanceMethods
30
+
31
+ private
32
+
33
+ def credentials=(value)
34
+ super
35
+ cookies = value.is_a?(Array) ? value.first : value
36
+ if cookies.is_a?(ActionController::CookieJar) && cookies[vk_app_cookie]
37
+ @vk_cookies = CGI::parse(cookies[vk_app_cookie])
38
+ end
39
+ end
40
+
41
+ def authenticating_with_vkontakte?
42
+ @vk_cookies
43
+ end
44
+
45
+ def validate_by_vk_cookie
46
+ result = "expire=%smid=%ssecret=%ssid=%s%s" % [@vk_cookies['expire'], @vk_cookies['mid'], @vk_cookies['secret'], @vk_cookies['sid'], self.class.vk_app_password]
47
+ if MD5.md5(result).to_s == @vk_cookies['sig'].to_s
48
+ raise(NotInitializedError, "you must define vk_id column in your User model") unless record_class.respond_to? find_by_vk_id_method
49
+ mid_cookie = @vk_cookies['mid'].first
50
+ possible_record = search_for_record(find_by_vk_id_method, mid_cookie)
51
+ if possible_record.nil?
52
+ possible_record = record_class.new(vk_id_field => mid_cookie)
53
+ possible_record.send :persistence_token=, Authlogic::Random.hex_token if possible_record.respond_to? :persistence_token=
54
+ possible_record.send :save, false
55
+ end
56
+ self.attempted_record = possible_record
57
+ end
58
+ end
59
+
60
+ def vk_app_cookie
61
+ self.class.vk_app_cookie
62
+ end
63
+
64
+ def find_by_vk_id_method
65
+ self.class.find_by_vk_id_method
66
+ end
67
+
68
+ def vk_id_field
69
+ self.class.vk_id_field
70
+ end
71
+
72
+ def record_class
73
+ self.class.klass
74
+ end
75
+
76
+ def destroy_vkontakte_cookies
77
+ controller.cookies.delete vk_app_cookie
78
+ end
79
+ end
80
+
81
+
82
+ end
83
+
84
+ ActiveRecord::Base.class_eval do
85
+ extend VkontakteAuthentication::ClassMethods
86
+ attr_accessible vk_id_field
87
+ end
88
+
89
+ Authlogic::Session::Base.class_eval do
90
+ include VkontakteAuthentication::InstanceMethods
91
+ extend VkontakteAuthentication::ClassMethods
92
+ after_destroy :destroy_vkontakte_cookies
93
+ validate :validate_by_vk_cookie, :if => :authenticating_with_vkontakte?
94
+ end
@@ -0,0 +1,20 @@
1
+ require "settings"
2
+
3
+ module VkontakteAuthentication
4
+ module Helper
5
+ include Settings
6
+
7
+ def vkontakte_init_tag
8
+ content_tag(:div, "", :id => "vk_api_transport") +
9
+ content_tag(:script, "init(#{vk_app_id});")
10
+ end
11
+
12
+ def vkontakte_javascript_include_tag
13
+ javascript_include_tag "vkontakte"
14
+ end
15
+
16
+ def vk_login_button
17
+ content_tag(:div, "", {:id => "vk_login", :onclick => "doLogin(); return false;"})
18
+ end
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: authlogic_vkontakte
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Igor Petrov
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-15 00:00:00 +04:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Bind vkontakte authentication to your authlogic project
23
+ email: garik.piton@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - README.rdoc
30
+ - lib/profile_loader.rb
31
+ - lib/settings.rb
32
+ - lib/tasks/vkontakte.rake
33
+ - lib/vkontakte_authentication.rb
34
+ - lib/vkontakte_helper.rb
35
+ files:
36
+ - README.rdoc
37
+ - Rakefile
38
+ - authlogic_vkontakte.gemspec
39
+ - init.rb
40
+ - js/vkontakte.js
41
+ - lib/profile_loader.rb
42
+ - lib/settings.rb
43
+ - lib/tasks/vkontakte.rake
44
+ - lib/vkontakte_authentication.rb
45
+ - lib/vkontakte_helper.rb
46
+ - Manifest
47
+ has_rdoc: true
48
+ homepage: http://github.com/GarPit/authlogic_vkontakte
49
+ licenses: []
50
+
51
+ post_install_message:
52
+ rdoc_options:
53
+ - --line-numbers
54
+ - --inline-source
55
+ - --title
56
+ - Authlogic_vkontakte
57
+ - --main
58
+ - README.rdoc
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ hash: 3
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 11
76
+ segments:
77
+ - 1
78
+ - 2
79
+ version: "1.2"
80
+ requirements: []
81
+
82
+ rubyforge_project: authlogic_vkontakte
83
+ rubygems_version: 1.3.7
84
+ signing_key:
85
+ specification_version: 3
86
+ summary: Bind vkontakte authentication to your authlogic project
87
+ test_files: []
88
+