From 9c5494f5ed0c08dee284c81de44df03cf1dc201e Mon Sep 17 00:00:00 2001 From: Junv Date: Wed, 6 Feb 2013 12:52:12 +0800 Subject: [PATCH] add qq login --- README.md | 7 +++- app/assets/images/qq_login.png | Bin 0 -> 7406 bytes app/controllers/home_controller.rb | 10 +++++- app/controllers/user_controller.rb | 9 ++++- app/views/user/login.html.slim | 4 +-- config/routes.rb | 2 ++ lib/qq_auth.rb | 55 +++++++++++++++++++++++++++++ 7 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 app/assets/images/qq_login.png create mode 100644 lib/qq_auth.rb diff --git a/README.md b/README.md index 80ec22c..c822c5e 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,9 @@ Build Status export CLIENT_ID='0858f96ac849895e190aec4058dc9c1a' export CLIENT_SECRET='0c363bc78dbacb3f' - export REDIRECT_URI='http://localhost:3000/douban_callback' \ No newline at end of file + export REDIRECT_URI='http://localhost:3000/douban_callback' + + + export QQ_CLIENT_ID='100375105' + export QQ_CLIENT_SECRET='773a9c80d43b0881e4344fd453d5dca4' + export QQ_REDIRECT_URI='http://libr.herokuapp.com/qq_callback' \ No newline at end of file diff --git a/app/assets/images/qq_login.png b/app/assets/images/qq_login.png new file mode 100644 index 0000000000000000000000000000000000000000..ebca59200c1b8b77773c37aade4d7c8fe0c2b03a GIT binary patch literal 7406 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 false @@ -11,7 +13,12 @@ class UserController < ApplicationController def auth_douban url = auth_url.to_s redirect_to url - end + end + + def auth_qq + url = qq_auth_url.to_s + redirect_to url + end def logout session[:name] = nil diff --git a/app/views/user/login.html.slim b/app/views/user/login.html.slim index e8613b6..505665b 100644 --- a/app/views/user/login.html.slim +++ b/app/views/user/login.html.slim @@ -17,5 +17,5 @@ html lang="en" a href="/login/douban" img src="/assets/douban.png" p - a href="" - img src="/assets/weibo.png" + a href="/login/qq" + img src="/assets/qq_login.png" diff --git a/config/routes.rb b/config/routes.rb index 5a1160d..9546f99 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,7 +11,9 @@ Libr::Application.routes.draw do get '/login' => 'user#login' get '/logout' => 'user#logout' get '/login/douban' => 'user#auth_douban' + get '/login/qq' => 'user#auth_qq' get '/douban_callback' =>'home#douban_callback' + get '/qq_callback'=>'home#qq_callback' get '/users/:id' => 'user#view' # The priority is based upon order of creation: diff --git a/lib/qq_auth.rb b/lib/qq_auth.rb new file mode 100644 index 0000000..33d90a6 --- /dev/null +++ b/lib/qq_auth.rb @@ -0,0 +1,55 @@ +require 'net/http' +require 'net/https' + +module QQAuth + def qq_auth_url + response_type = 'code' + scope = 'get_user_info' + + url = 'https://graph.qq.com/oauth2.0/authorize?client_id=' + ::ENV['QQ_CLIENT_ID'] + + '&redirect_uri=' + ::ENV['QQ_REDIRECT_URI'] + + '&response_type=' + response_type + + '&scope=' + scope + "&state=libr_test" + + end + + def qq_auth_token(code) + http = Net::HTTP.new('graph.qq.com', 443) + http.use_ssl = true + path ='/oauth2.0/token?' + + '&client_id='+ ::ENV['QQ_CLIENT_ID']+ + '&client_secret='+ ::ENV['QQ_CLIENT_SECRET']+ + '&redirect_uri='+::ENV['QQ_REDIRECT_URI']+ + '&grant_type=authorization_code&code='+code + + response = http.get(path, nil) + response = JSON.parse response.body + response['access_token'] + + end + + def fetch_qq_open_id(access_token) + http = Net::HTTP.new('graph.qq.com', 443) + http.use_ssl = true + path ='/oauth2.0/me?' + + '&access_token='+access_token + + response = http.get(path, nil) + response = JSON.parse response.body + response['openid'] + end + + def fetch_qq_user_info(access_token, openid) + http = Net::HTTP.new('graph.qq.com', 443) + http.use_ssl = true + path ='/user/get_user_info?' + + '&access_token='+access_token + + '&oauth_consumer_key=' +::ENV['QQ_CLIENT_ID'] + + '&openid=' +openid + response = http.get(path, nil) + response = JSON.parse response.body + puts "response====" +response.to_s + response + + end +end \ No newline at end of file