diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..0b3a6b1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+.bundle
+*.swp
+.gem
+Gemfile.lock
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..15f8811
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/omniauth-weibo-oauth2.iml b/.idea/omniauth-weibo-oauth2.iml
new file mode 100644
index 0000000..7d46842
--- /dev/null
+++ b/.idea/omniauth-weibo-oauth2.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..266b72d
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,13 @@
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in omniauth-weibo-oauth2.gemspec
+gemspec
+
+group :development, :test do
+ gem 'guard'
+ gem 'guard-rspec'
+ gem 'guard-bundler'
+ gem 'rb-fsevent'
+ gem 'growl'
+ gem 'rake'
+end
\ No newline at end of file
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..1793c01
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2024 Toastie
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 0000000..591ff85
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,7 @@
+#!/usr/bin/env rake
+require File.join('bundler', 'gem_tasks')
+require File.join('rspec', 'core', 'rake_task')
+
+RSpec::Core::RakeTask.new(:spec)
+
+task :default => :spec
\ No newline at end of file
diff --git a/lib/omniauth-weibo-oauth2.rb b/lib/omniauth-weibo-oauth2.rb
new file mode 100644
index 0000000..0a36aa0
--- /dev/null
+++ b/lib/omniauth-weibo-oauth2.rb
@@ -0,0 +1,2 @@
+require "omniauth-weibo-oauth2/version"
+require "omniauth/strategies/weibo"
\ No newline at end of file
diff --git a/lib/omniauth-weibo-oauth2/version.rb b/lib/omniauth-weibo-oauth2/version.rb
new file mode 100644
index 0000000..b3b93f2
--- /dev/null
+++ b/lib/omniauth-weibo-oauth2/version.rb
@@ -0,0 +1,5 @@
+module OmniAuth
+ module WeiboOauth2
+ VERSION = "0.5.2"
+ end
+end
\ No newline at end of file
diff --git a/lib/omniauth/strategies/weibo.rb b/lib/omniauth/strategies/weibo.rb
new file mode 100644
index 0000000..41ff877
--- /dev/null
+++ b/lib/omniauth/strategies/weibo.rb
@@ -0,0 +1,113 @@
+require "omniauth-oauth2"
+
+module OmniAuth
+ module Strategies
+ class Weibo < OmniAuth::Strategies::OAuth2
+ option :client_options, {
+ :site => "https://api.weibo.com",
+ :authorize_url => "/oauth2/authorize",
+ :token_url => "/oauth2/access_token",
+ :token_method => :post
+ }
+ option :token_params, {
+ :parse => :json
+ }
+
+ uid do
+ raw_info['id']
+ end
+
+ info do
+ {
+ :nickname => raw_info['screen_name'],
+ :name => raw_info['name'],
+ :location => raw_info['location'],
+ :image => image_url,
+ :description => raw_info['description'],
+ :urls => {
+ 'Blog' => raw_info['url'],
+ 'Weibo' => raw_info['domain'].empty? ? "https://weibo.com/u/#{raw_info['id']}" : "https://weibo.com/#{raw_info['domain']}",
+ }
+ }
+ end
+
+ extra do
+ {
+ :raw_info => raw_info
+ }
+ end
+
+ def callback_url
+ token_params_redirect || (full_host + script_name + callback_path)
+ end
+
+ def token_params_redirect
+ token_params['redirect_uri'] || token_params[:redirect_uri]
+ end
+
+ def raw_info
+ access_token.options[:mode] = :query
+ access_token.options[:param_name] = 'access_token'
+ @uid ||= access_token.get('/2/account/get_uid.json').parsed["uid"]
+ @raw_info ||= access_token.get("/2/users/show.json", :params => {:uid => @uid}).parsed
+ end
+
+ def find_image
+ raw_info[%w(avatar_hd avatar_large profile_image_url).find { |e| raw_info[e].present? }]
+ end
+
+ #url: option: size:
+ #avatar_hd original original_size
+ #avatar_large large 180x180
+ #profile_image_url middle 50x50
+ # small 30x30
+ #default is middle
+ def image_url
+ image_size = options[:image_size] || :middle
+ case image_size.to_sym
+ when :original
+ url = raw_info['avatar_hd']
+ when :large
+ url = raw_info['avatar_large']
+ when :small
+ url = raw_info['avatar_large'].sub('/180/','/30/')
+ else
+ url = raw_info['profile_image_url']
+ end
+ end
+
+ ##
+ # You can pass +display+, +with_offical_account+ or +state+ params to the auth request, if
+ # you need to set them dynamically. You can also set these options
+ # in the OmniAuth config :authorize_params option.
+ #
+ # /auth/weibo?display=mobile&with_offical_account=1
+ #
+ def authorize_params
+ super.tap do |params|
+ %w[display with_offical_account forcelogin state].each do |v|
+ if request.params[v]
+ params[v.to_sym] = request.params[v]
+ end
+ session["omniauth.state"] = params[v.to_sym] if v == 'state'
+ end
+ end
+ end
+
+ protected
+ def build_access_token
+ params = {
+ 'client_id' => client.id,
+ 'client_secret' => client.secret,
+ 'code' => request.params['code'],
+ 'grant_type' => 'authorization_code',
+ 'redirect_uri' => callback_url
+ }.merge(token_params.to_hash(symbolize_keys: true))
+ client.get_token(params, deep_symbolize(options.token_params))
+ end
+
+ end
+ end
+end
+
+OmniAuth.config.add_camelization "weibo", "Weibo"
\ No newline at end of file
diff --git a/omniauth-weibo-oauth2.gemspec b/omniauth-weibo-oauth2.gemspec
new file mode 100644
index 0000000..248dc29
--- /dev/null
+++ b/omniauth-weibo-oauth2.gemspec
@@ -0,0 +1,21 @@
+# -*- encoding: utf-8 -*-
+require File.expand_path('../lib/omniauth-weibo-oauth2/version', __FILE__)
+
+Gem::Specification.new do |gem|
+ gem.authors = "Bin He"
+ gem.email = "beenhero@gmail.com"
+ gem.description = %q{OmniAuth Oauth2 strategy for weibo.com.}
+ gem.summary = %q{OmniAuth Oauth2 strategy for weibo.com.}
+ gem.homepage = "https://github.com/beenhero/omniauth-weibo-oauth2"
+ gem.license = "MIT"
+
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
+ gem.files = `git ls-files`.split("\n")
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
+ gem.name = "omniauth-weibo-oauth2"
+ gem.require_paths = ["lib"]
+ gem.version = OmniAuth::WeiboOauth2::VERSION
+
+ gem.add_dependency 'omniauth', '~> 1.5'
+ gem.add_dependency 'omniauth-oauth2', '>= 1.4.0'
+end
\ No newline at end of file