Преглед изворни кода

Merge branch 'master' of https://github.com/2DU/opennamu

Surplus_Up (2DU) пре 7 година
родитељ
комит
0fdd893eea
6 измењених фајлова са 62 додато и 4 уклоњено
  1. 1 1
      app.py
  2. 5 1
      data/oauthsettings.json
  3. 1 0
      language/en-US.json
  4. 1 0
      language/ko-KR.json
  5. 46 2
      route/login_oauth.py
  6. 8 0
      views/main_css/oauth.css

+ 1 - 1
app.py

@@ -445,7 +445,7 @@ def close_topic_list(name = None, tool = None):
 def login():
     return login_2(conn)
 
-@app.route('/oauth/<regex("discord|naver|facebook"):platform>/<regex("init|callback"):func>', methods=['GET', 'POST'])
+@app.route('/oauth/<regex("discord|naver|facebook|kakao"):platform>/<regex("init|callback"):func>', methods=['GET', 'POST'])
 def login_oauth(platform = None, func = None):
     return login_oauth_2(conn, platform, func)
                 

+ 5 - 1
data/oauthsettings.json

@@ -2,7 +2,7 @@
     "_README" : {
         "en" : "To use the oAuth login feature, you must set the 'publish_url' value to a domain address that includes the HTTPS protocol, and actually support HTTPS connections.",
         "ko" : "oAuth 로그인 기능을 사용하려면 'publish_url' 값을 HTTPS 프로토콜을 포함한 도메인 주소로 설정하고, 실제로 HTTPS 연결을 지원해야 합니다.",
-        "support" : ["discord", "facebook", "naver"]
+        "support" : ["discord", "facebook", "naver", "kakao"]
     },
     "publish_url" : "https://",
     "discord" : {
@@ -16,5 +16,9 @@
     "naver" : {
         "client_id" : "",
         "client_secret" : ""
+    },
+    "kakao" : {
+        "client_id" : "",
+        "client_secret" : ""
     }
 }

+ 1 - 0
language/en-US.json

@@ -122,6 +122,7 @@
         "oauth_signin_facebook" : "Sign-in with Facebook",
         "oauth_signin_naver" : "Sign-in with NAVER",
         "oauth_signin_discord" : "Sign-in with Discord",
+        "oauth_signin_kakao" : "Sign-in with Kakao",
         "connection" : "Connection",
         "new_connection" : "Connect...",
         "user_setting" : "User settings",

+ 1 - 0
language/ko-KR.json

@@ -122,6 +122,7 @@
         "oauth_signin_facebook" : "Facebook 아이디로 로그인",
         "oauth_signin_naver" : "네이버 아이디로 로그인",
         "oauth_signin_discord" : "디스코드 아이디로 로그인",
+        "oauth_signin_kakao" : "카카오톡 아이디로 로그인",
         "connection" : "연결",
         "new_connection" : "연결...",
         "user_setting" : "사용자 설정",

+ 46 - 2
route/login_oauth.py

@@ -25,6 +25,10 @@ def login_oauth_2(conn, platform, func):
         api_url['redirect'] = 'https://www.facebook.com/v3.1/dialog/oauth'
         api_url['token'] = 'https://graph.facebook.com/v3.1/oauth/access_token'
         api_url['profile'] = 'https://graph.facebook.com/me'
+    elif platform == 'kakao':
+        api_url['redirect'] = 'https://kauth.kakao.com/oauth/authorize'
+        api_url['token'] = 'https://kauth.kakao.com/oauth/token'
+        api_url['profile'] = 'https://kapi.kakao.com/v2/user/me'
 
     if func == 'init':
         if oauth_data['client_id'] == '' or oauth_data['client_secret'] == '':
@@ -69,6 +73,11 @@ def login_oauth_2(conn, platform, func):
                 data['redirect_uri'], 
                 data['state']
             ))
+        elif platform == 'kakao':
+            return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&response_type=code'.format(
+                data['client_id'], 
+                data['redirect_uri']
+            ))
 
     elif func == 'callback':
         code = flask.request.args.get('code')
@@ -95,7 +104,7 @@ def login_oauth_2(conn, platform, func):
                 'User-Agent': 'Mozilla/5.0'
             }
             token_exchange = urllib.request.Request(
-                'https://discordapp.com/api/oauth2/token',
+                api_url['token'],
                 data = bytes(urllib.parse.urlencode(data).encode()),
                 headers = headers
             )
@@ -107,7 +116,7 @@ def login_oauth_2(conn, platform, func):
                 'Authorization' : 'Bearer ' + token_json['access_token']
             }
             profile_exchange = urllib.request.Request(
-                'https://discordapp.com/api/users/@me',
+                api_url['profile'],
                 headers = headers
             )
             profile_result =  urllib.request.urlopen(profile_exchange).read().decode('utf-8')
@@ -159,6 +168,41 @@ def login_oauth_2(conn, platform, func):
                 'name': profile_result_json['name'], 
                 'picture': profile_result_json['picture']['data']['url']
             }
+        elif platform == 'kakao':
+            data = {
+                'client_id'     : data['client_id'],
+                'client_secret' : data['client_secret'],
+                'grant_type'    : 'authorization_code',
+                'redirect_uri'  : data['redirect_uri'],
+                'code'          : code
+            }
+            headers = {
+                'Content-Type': 'application/x-www-form-urlencoded',
+                'User-Agent': 'Mozilla/5.0'
+            }
+            token_exchange = urllib.request.Request(
+                api_url['token'],
+                data = bytes(urllib.parse.urlencode(data).encode()),
+                headers = headers
+            )
+            token_result = urllib.request.urlopen(token_exchange).read()
+            token_json = json.loads(token_result)
+
+            headers = {
+                'User-Agent'    : 'Mozilla/5.0',
+                'Authorization' : 'Bearer ' + token_json['access_token']
+            }
+            profile_exchange = urllib.request.Request(
+                api_url['profile'],
+                headers = headers
+            )
+            profile_result =  urllib.request.urlopen(profile_exchange).read().decode('utf-8')
+            profile_result_json = json.loads(profile_result)
+            stand_json = {
+                'id'        : profile_result_json['id'], 
+                'name'      : profile_result_json['properties']['nickname'],
+                'picture'   : profile_result_json['properties']['profile_image']
+            }
         
         if flask.session['referrer'][0:6] == 'change':
             curs.execute('select * from oauth_conn where wiki_id = ? and provider = ?', [flask.session['id'], platform])

+ 8 - 0
views/main_css/oauth.css

@@ -37,6 +37,10 @@
 .oauth-btn.oauth-btn-discord {
     background-color: #2C2F33;
 }
+.oauth-btn.oauth-btn-kakao {
+    background-color: #ffde00;
+    color: #3c1e1e;
+}
 
 .oauth-btn-logo {
     position: absolute;
@@ -61,4 +65,8 @@
 
 .oauth-btn-logo.oauth-btn-discord {
     background-image: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjQ1IDI0MCI+PHN0eWxlPi5zdDB7ZmlsbDojRkZGRkZGO308L3N0eWxlPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMDQuNCAxMDMuOWMtNS43IDAtMTAuMiA1LTEwLjIgMTEuMXM0LjYgMTEuMSAxMC4yIDExLjFjNS43IDAgMTAuMi01IDEwLjItMTEuMS4xLTYuMS00LjUtMTEuMS0xMC4yLTExLjF6TTE0MC45IDEwMy45Yy01LjcgMC0xMC4yIDUtMTAuMiAxMS4xczQuNiAxMS4xIDEwLjIgMTEuMWM1LjcgMCAxMC4yLTUgMTAuMi0xMS4xcy00LjUtMTEuMS0xMC4yLTExLjF6Ii8+PHBhdGggY2xhc3M9InN0MCIgZD0iTTE4OS41IDIwaC0xMzRDNDQuMiAyMCAzNSAyOS4yIDM1IDQwLjZ2MTM1LjJjMCAxMS40IDkuMiAyMC42IDIwLjUgMjAuNmgxMTMuNGwtNS4zLTE4LjUgMTIuOCAxMS45IDEyLjEgMTEuMiAyMS41IDE5VjQwLjZjMC0xMS40LTkuMi0yMC42LTIwLjUtMjAuNnptLTM4LjYgMTMwLjZzLTMuNi00LjMtNi42LTguMWMxMy4xLTMuNyAxOC4xLTExLjkgMTguMS0xMS45LTQuMSAyLjctOCA0LjYtMTEuNSA1LjktNSAyLjEtOS44IDMuNS0xNC41IDQuMy05LjYgMS44LTE4LjQgMS4zLTI1LjktLjEtNS43LTEuMS0xMC42LTIuNy0xNC43LTQuMy0yLjMtLjktNC44LTItNy4zLTMuNC0uMy0uMi0uNi0uMy0uOS0uNS0uMi0uMS0uMy0uMi0uNC0uMy0xLjgtMS0yLjgtMS43LTIuOC0xLjdzNC44IDggMTcuNSAxMS44Yy0zIDMuOC02LjcgOC4zLTYuNyA4LjMtMjIuMS0uNy0zMC41LTE1LjItMzAuNS0xNS4yIDAtMzIuMiAxNC40LTU4LjMgMTQuNC01OC4zIDE0LjQtMTAuOCAyOC4xLTEwLjUgMjguMS0xMC41bDEgMS4yYy0xOCA1LjItMjYuMyAxMy4xLTI2LjMgMTMuMXMyLjItMS4yIDUuOS0yLjljMTAuNy00LjcgMTkuMi02IDIyLjctNi4zLjYtLjEgMS4xLS4yIDEuNy0uMiA2LjEtLjggMTMtMSAyMC4yLS4yIDkuNSAxLjEgMTkuNyAzLjkgMzAuMSA5LjYgMCAwLTcuOS03LjUtMjQuOS0xMi43bDEuNC0xLjZzMTMuNy0uMyAyOC4xIDEwLjVjMCAwIDE0LjQgMjYuMSAxNC40IDU4LjMgMCAwLTguNSAxNC41LTMwLjYgMTUuMnoiLz48L3N2Zz4=);
+}
+
+.oauth-btn-logo.oauth-btn-kakao{
+    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii03NSAtOTAgMzUwIDM1MCI+PHBhdGggY2xhc3M9Imtha2FvIGxvZ28iIGZpbGw9IiMzYzFlMWUiIGQ9Ik00NSAxNDBsLTUgNDUgNTAtMzUtNDUtMTB6Ii8+PGVsbGlwc2UgY2xhc3M9Imtha2FvIGxvZ28iIGZpbGw9IiMzYzFlMWUiIGN4PSIxMDAiIGN5PSI4MCIgcng9IjEwMCIgcnk9IjgwIi8+PC9zdmc+);
 }