From c45355aa0bce488189a26ad12c6efea4a86cf95f Mon Sep 17 00:00:00 2001 From: Toastie Date: Sat, 23 Nov 2024 17:55:44 +1300 Subject: [PATCH] Added files --- .gitignore | 4 + .idea/.gitignore | 8 ++ .idea/modules.xml | 8 ++ .idea/omniauth-weibo-oauth2.iml | 19 +++++ Gemfile | 13 +++ LICENSE.txt | 21 +++++ Rakefile | 7 ++ lib/omniauth-weibo-oauth2.rb | 2 + lib/omniauth-weibo-oauth2/version.rb | 5 ++ lib/omniauth/strategies/weibo.rb | 113 +++++++++++++++++++++++++++ omniauth-weibo-oauth2.gemspec | 21 +++++ 11 files changed, 221 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/modules.xml create mode 100644 .idea/omniauth-weibo-oauth2.iml create mode 100644 Gemfile create mode 100644 LICENSE.txt create mode 100644 Rakefile create mode 100644 lib/omniauth-weibo-oauth2.rb create mode 100644 lib/omniauth-weibo-oauth2/version.rb create mode 100644 lib/omniauth/strategies/weibo.rb create mode 100644 omniauth-weibo-oauth2.gemspec 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