login_oauth.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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 re_error('/error/31')
  32. elif publish_url == 'https://':
  33. return re_error('/error/32')
  34. referrer_re = re.compile(r'(?P<host>^(https?):\/\/([^\/]+))\/(?P<refer>[^\/?]+)')
  35. if flask.request.referrer != None:
  36. referrer = referrer_re.search(flask.request.referrer)
  37. if referrer.group('host') != load_oauth('publish_url'):
  38. return redirect()
  39. else:
  40. flask.session['referrer'] = referrer.group('refer')
  41. else:
  42. return redirect()
  43. flask.session['refer'] = flask.request.referrer
  44. if platform == 'discord':
  45. return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&response_type=code&scope=identify'.format(
  46. data['client_id'],
  47. data['redirect_uri']
  48. ))
  49. elif platform == 'naver':
  50. return redirect(api_url['redirect'] + '?response_type=code&client_id={}&redirect_uri={}&state={}'.format(
  51. data['client_id'],
  52. data['redirect_uri'],
  53. data['state']
  54. ))
  55. elif platform == 'facebook':
  56. return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&state={}'.format(
  57. data['client_id'],
  58. data['redirect_uri'],
  59. data['state']
  60. ))
  61. elif platform == 'kakao':
  62. return redirect(api_url['redirect'] + '?client_id={}&redirect_uri={}&response_type=code'.format(
  63. data['client_id'],
  64. data['redirect_uri']
  65. ))
  66. elif func == 'callback':
  67. code = flask.request.args.get('code')
  68. state = flask.request.args.get('state')
  69. if code == None:
  70. return re_error('/error/30')
  71. if platform == 'discord':
  72. data = {
  73. 'client_id' : data['client_id'],
  74. 'client_secret' : data['client_secret'],
  75. 'grant_type' : 'authorization_code',
  76. 'redirect_uri' : data['redirect_uri'],
  77. 'scope' : 'identify',
  78. 'code' : code
  79. }
  80. headers = {
  81. 'Content-Type': 'application/x-www-form-urlencoded',
  82. 'User-Agent': 'Mozilla/5.0'
  83. }
  84. token_exchange = urllib.request.Request(
  85. api_url['token'],
  86. data = bytes(urllib.parse.urlencode(data).encode()),
  87. headers = headers
  88. )
  89. token_result = urllib.request.urlopen(token_exchange).read()
  90. token_json = json.loads(token_result)
  91. headers = {
  92. 'User-Agent' : 'Mozilla/5.0',
  93. 'Authorization' : 'Bearer ' + token_json['access_token']
  94. }
  95. profile_exchange = urllib.request.Request(
  96. api_url['profile'],
  97. headers = headers
  98. )
  99. profile_result = urllib.request.urlopen(profile_exchange).read().decode('utf-8')
  100. profile_result_json = json.loads(profile_result)
  101. stand_json = {
  102. 'id' : profile_result_json['id'],
  103. 'name' : profile_result_json['username'] + '#' + profile_result_json['discriminator'],
  104. 'picture' : profile_result_json['avatar']
  105. }
  106. elif platform == 'naver':
  107. token_access = api_url['token'] + '?grant_type=authorization_code&client_id={}&client_secret={}&code={}&state={}'.format(
  108. data['client_id'],
  109. data['client_secret'],
  110. code,
  111. state
  112. )
  113. token_result = urllib.request.urlopen(token_access).read().decode('utf-8')
  114. token_result_json = json.loads(token_result)
  115. headers = {
  116. 'Authorization': 'Bearer {}'.format(token_result_json['access_token'])
  117. }
  118. profile_access = urllib.request.Request(api_url['profile'], headers = headers)
  119. profile_result = urllib.request.urlopen(profile_access).read().decode('utf-8')
  120. profile_result_json = json.loads(profile_result)
  121. stand_json = {
  122. 'id' : profile_result_json['response']['id'],
  123. 'name' : profile_result_json['response']['name'],
  124. 'picture' : profile_result_json['response']['profile_image']
  125. }
  126. elif platform == 'facebook':
  127. token_access = api_url['token'] + '?client_id={}&redirect_uri={}&client_secret={}&code={}'.format(
  128. data['client_id'],
  129. data['redirect_uri'],
  130. data['client_secret'],
  131. code
  132. )
  133. token_result = urllib.request.urlopen(token_access).read().decode('utf-8')
  134. token_result_json = json.loads(token_result)
  135. profile_access = api_url['profile'] + '?fields=id,name,picture&access_token={}'.format(token_result_json['access_token'])
  136. profile_result = urllib.request.urlopen(profile_access).read().decode('utf-8')
  137. profile_result_json = json.loads(profile_result)
  138. stand_json = {
  139. 'id': profile_result_json['id'],
  140. 'name': profile_result_json['name'],
  141. 'picture': profile_result_json['picture']['data']['url']
  142. }
  143. elif platform == 'kakao':
  144. data = {
  145. 'client_id' : data['client_id'],
  146. 'client_secret' : data['client_secret'],
  147. 'grant_type' : 'authorization_code',
  148. 'redirect_uri' : data['redirect_uri'],
  149. 'code' : code
  150. }
  151. headers = {
  152. 'Content-Type': 'application/x-www-form-urlencoded',
  153. 'User-Agent': 'Mozilla/5.0'
  154. }
  155. token_exchange = urllib.request.Request(
  156. api_url['token'],
  157. data = bytes(urllib.parse.urlencode(data).encode()),
  158. headers = headers
  159. )
  160. token_result = urllib.request.urlopen(token_exchange).read()
  161. token_json = json.loads(token_result)
  162. headers = {
  163. 'User-Agent' : 'Mozilla/5.0',
  164. 'Authorization' : 'Bearer ' + token_json['access_token']
  165. }
  166. profile_exchange = urllib.request.Request(
  167. api_url['profile'],
  168. headers = headers
  169. )
  170. profile_result = urllib.request.urlopen(profile_exchange).read().decode('utf-8')
  171. profile_result_json = json.loads(profile_result)
  172. stand_json = {
  173. 'id' : profile_result_json['id'],
  174. 'name' : profile_result_json['properties']['nickname'],
  175. 'picture' : profile_result_json['properties']['profile_image']
  176. }
  177. if flask.session['referrer'][0:6] == 'change':
  178. curs.execute(db_change('select * from oauth_conn where wiki_id = ? and provider = ?'), [flask.session['id'], platform])
  179. oauth_result = curs.fetchall()
  180. if len(oauth_result) == 0:
  181. curs.execute(db_change('insert into oauth_conn (provider, wiki_id, sns_id, name, picture) values(?, ?, ?, ?, ?)'), [
  182. platform,
  183. flask.session['id'],
  184. stand_json['id'],
  185. stand_json['name'],
  186. stand_json['picture']
  187. ])
  188. else:
  189. curs.execute(db_change('update oauth_conn set name = ? picture = ? where wiki_id = ?'), [
  190. stand_json['name'],
  191. stand_json['picture'],
  192. flask.session['id']
  193. ])
  194. conn.commit()
  195. elif flask.session['referrer'][0:5] == 'login':
  196. curs.execute(db_change('select * from oauth_conn where provider = ? and sns_id = ?'), [platform, stand_json['id']])
  197. curs_result = curs.fetchall()
  198. if len(curs_result) == 0:
  199. return re_error('/error/2')
  200. else:
  201. flask.session['state'] = 1
  202. flask.session['id'] = curs_result[0][2]
  203. return redirect(flask.session['refer'])