login_oauth.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. from .tool.func import *
  2. def login_oauth_2(conn, platform, func):
  3. curs = conn.cursor()
  4. publish_url = load_oauth('publish_url')
  5. oauth_data = load_oauth(platform)
  6. api_url = {}
  7. data = {
  8. 'client_id' : oauth_data['client_id'],
  9. 'client_secret' : oauth_data['client_secret'],
  10. 'redirect_uri' : publish_url + '/oauth/' + platform + '/callback',
  11. 'state' : 'RAMDOMVALUE'
  12. }
  13. if platform == 'discord':
  14. api_url['redirect'] = 'https://discordapp.com/api/oauth2/authorize'
  15. api_url['token'] = 'https://discordapp.com/api/oauth2/token'
  16. api_url['profile'] = 'https://discordapp.com/api/users/@me'
  17. elif platform == 'naver':
  18. api_url['redirect'] = 'https://nid.naver.com/oauth2.0/authorize'
  19. api_url['token'] = 'https://nid.naver.com/oauth2.0/token'
  20. api_url['profile'] = 'https://openapi.naver.com/v1/nid/me'
  21. elif platform == 'facebook':
  22. api_url['redirect'] = 'https://www.facebook.com/v3.1/dialog/oauth'
  23. api_url['token'] = 'https://graph.facebook.com/v3.1/oauth/access_token'
  24. api_url['profile'] = 'https://graph.facebook.com/me'
  25. elif platform == 'kakao':
  26. api_url['redirect'] = 'https://kauth.kakao.com/oauth/authorize'
  27. api_url['token'] = 'https://kauth.kakao.com/oauth/token'
  28. api_url['profile'] = 'https://kapi.kakao.com/v2/user/me'
  29. if func == 'init':
  30. if oauth_data['client_id'] == '' or oauth_data['client_secret'] == '':
  31. return easy_minify(flask.render_template(skin_check(),
  32. imp = [load_lang('error'), wiki_set(), custom(), other2([0, 0])],
  33. data = load_lang('oauth_disabled'),
  34. menu = [['user', load_lang('return')]]
  35. ))
  36. elif publish_url == 'https://':
  37. return easy_minify(flask.render_template(skin_check(),
  38. imp = [load_lang('error'), wiki_set(), custom(), other2([0, 0])],
  39. data = load_lang('oauth_setting_not_found'),
  40. menu = [['user', load_lang('return')]]
  41. ))
  42. referrer_re = re.compile(r'(?P<host>^(https?):\/\/([^\/]+))\/(?P<refer>[^\/?]+)')
  43. if flask.request.referrer != None:
  44. referrer = referrer_re.search(flask.request.referrer)
  45. if referrer.group('host') != load_oauth('publish_url'):
  46. return redirect()
  47. else:
  48. flask.session['referrer'] = referrer.group('refer')
  49. else:
  50. return redirect()
  51. flask.session['refer'] = flask.request.referrer
  52. if platform == 'discord':
  53. return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&response_type=code&scope=identify'.format(
  54. data['client_id'],
  55. data['redirect_uri']
  56. ))
  57. elif platform == 'naver':
  58. return redirect(api_url['redirect'] + '?response_type=code&client_id={}&redirect_uri={}&state={}'.format(
  59. data['client_id'],
  60. data['redirect_uri'],
  61. data['state']
  62. ))
  63. elif platform == 'facebook':
  64. return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&state={}'.format(
  65. data['client_id'],
  66. data['redirect_uri'],
  67. data['state']
  68. ))
  69. elif platform == 'kakao':
  70. return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&response_type=code'.format(
  71. data['client_id'],
  72. data['redirect_uri']
  73. ))
  74. elif func == 'callback':
  75. code = flask.request.args.get('code')
  76. state = flask.request.args.get('state')
  77. if code == None:
  78. return easy_minify(flask.render_template(skin_check(),
  79. imp = [load_lang('inter_error'), wiki_set(), custom(), other2([0, 0])],
  80. data = '<h2>ie_wrong_callback</h2>' + load_lang('ie_wrong_callback'),
  81. menu = [['user', load_lang('return')]]
  82. ))
  83. if platform == 'discord':
  84. data = {
  85. 'client_id' : data['client_id'],
  86. 'client_secret' : data['client_secret'],
  87. 'grant_type' : 'authorization_code',
  88. 'redirect_uri' : data['redirect_uri'],
  89. 'scope' : 'identify',
  90. 'code' : code
  91. }
  92. headers = {
  93. 'Content-Type': 'application/x-www-form-urlencoded',
  94. 'User-Agent': 'Mozilla/5.0'
  95. }
  96. token_exchange = urllib.request.Request(
  97. api_url['token'],
  98. data = bytes(urllib.parse.urlencode(data).encode()),
  99. headers = headers
  100. )
  101. token_result = urllib.request.urlopen(token_exchange).read()
  102. token_json = json.loads(token_result)
  103. headers = {
  104. 'User-Agent' : 'Mozilla/5.0',
  105. 'Authorization' : 'Bearer ' + token_json['access_token']
  106. }
  107. profile_exchange = urllib.request.Request(
  108. api_url['profile'],
  109. headers = headers
  110. )
  111. profile_result = urllib.request.urlopen(profile_exchange).read().decode('utf-8')
  112. profile_result_json = json.loads(profile_result)
  113. stand_json = {
  114. 'id' : profile_result_json['id'],
  115. 'name' : profile_result_json['username'] + '#' + profile_result_json['discriminator'],
  116. 'picture' : profile_result_json['avatar']
  117. }
  118. elif platform == 'naver':
  119. token_access = api_url['token'] + '?grant_type=authorization_code&client_id={}&client_secret={}&code={}&state={}'.format(
  120. data['client_id'],
  121. data['client_secret'],
  122. code,
  123. state
  124. )
  125. token_result = urllib.request.urlopen(token_access).read().decode('utf-8')
  126. token_result_json = json.loads(token_result)
  127. headers = {
  128. 'Authorization': 'Bearer {}'.format(token_result_json['access_token'])
  129. }
  130. profile_access = urllib.request.Request(api_url['profile'], headers = headers)
  131. profile_result = urllib.request.urlopen(profile_access).read().decode('utf-8')
  132. profile_result_json = json.loads(profile_result)
  133. stand_json = {
  134. 'id' : profile_result_json['response']['id'],
  135. 'name' : profile_result_json['response']['name'],
  136. 'picture' : profile_result_json['response']['profile_image']
  137. }
  138. elif platform == 'facebook':
  139. token_access = api_url['token'] + '?client_id={}&redirect_uri={}&client_secret={}&code={}'.format(
  140. data['client_id'],
  141. data['redirect_uri'],
  142. data['client_secret'],
  143. code
  144. )
  145. token_result = urllib.request.urlopen(token_access).read().decode('utf-8')
  146. token_result_json = json.loads(token_result)
  147. profile_access = api_url['profile'] + '?fields=id,name,picture&access_token={}'.format(token_result_json['access_token'])
  148. profile_result = urllib.request.urlopen(profile_access).read().decode('utf-8')
  149. profile_result_json = json.loads(profile_result)
  150. stand_json = {
  151. 'id': profile_result_json['id'],
  152. 'name': profile_result_json['name'],
  153. 'picture': profile_result_json['picture']['data']['url']
  154. }
  155. elif platform == 'kakao':
  156. data = {
  157. 'client_id' : data['client_id'],
  158. 'client_secret' : data['client_secret'],
  159. 'grant_type' : 'authorization_code',
  160. 'redirect_uri' : data['redirect_uri'],
  161. 'code' : code
  162. }
  163. headers = {
  164. 'Content-Type': 'application/x-www-form-urlencoded',
  165. 'User-Agent': 'Mozilla/5.0'
  166. }
  167. token_exchange = urllib.request.Request(
  168. api_url['token'],
  169. data = bytes(urllib.parse.urlencode(data).encode()),
  170. headers = headers
  171. )
  172. token_result = urllib.request.urlopen(token_exchange).read()
  173. token_json = json.loads(token_result)
  174. headers = {
  175. 'User-Agent' : 'Mozilla/5.0',
  176. 'Authorization' : 'Bearer ' + token_json['access_token']
  177. }
  178. profile_exchange = urllib.request.Request(
  179. api_url['profile'],
  180. headers = headers
  181. )
  182. profile_result = urllib.request.urlopen(profile_exchange).read().decode('utf-8')
  183. profile_result_json = json.loads(profile_result)
  184. stand_json = {
  185. 'id' : profile_result_json['id'],
  186. 'name' : profile_result_json['properties']['nickname'],
  187. 'picture' : profile_result_json['properties']['profile_image']
  188. }
  189. if flask.session['referrer'][0:6] == 'change':
  190. curs.execute(db_change('select * from oauth_conn where wiki_id = ? and provider = ?'), [flask.session['id'], platform])
  191. oauth_result = curs.fetchall()
  192. if len(oauth_result) == 0:
  193. curs.execute(db_change('insert into oauth_conn (provider, wiki_id, sns_id, name, picture) values(?, ?, ?, ?, ?)'), [
  194. platform,
  195. flask.session['id'],
  196. stand_json['id'],
  197. stand_json['name'],
  198. stand_json['picture']
  199. ])
  200. else:
  201. curs.execute(db_change('update oauth_conn set name = ? picture = ? where wiki_id = ?'), [
  202. stand_json['name'],
  203. stand_json['picture'],
  204. flask.session['id']
  205. ])
  206. conn.commit()
  207. elif flask.session['referrer'][0:5] == 'login':
  208. curs.execute(db_change('select * from oauth_conn where provider = ? and sns_id = ?'), [platform, stand_json['id']])
  209. curs_result = curs.fetchall()
  210. if len(curs_result) == 0:
  211. return re_error('/error/2')
  212. else:
  213. flask.session['state'] = 1
  214. flask.session['id'] = curs_result[0][2]
  215. return redirect(flask.session['refer'])