提交 dac245db7b885b8d7fafea99ae6fcb123af441cf

作者 qianyingz
1 个父辈 eec7ae2f

fixed bug# 登录、注销对接三方登录

@@ -37,6 +37,16 @@ def split_by_crlf(s): @@ -37,6 +37,16 @@ def split_by_crlf(s):
37 return [v for v in s.splitlines() if v] 37 return [v for v in s.splitlines() if v]
38 38
39 39
  40 +def getRedirectUrl(request): # 获取重定向地址
  41 + # 获取头部信息
  42 + X_Forwarded_Proto = request.headers.get("X-Forwarded-Proto") # 协议
  43 + X_Forwarded_Host = request.headers.get("X-Forwarded-Host") # host
  44 + if not X_Forwarded_Proto == None and not X_Forwarded_Host == None:
  45 + return X_Forwarded_Proto+"://"+X_Forwarded_Host
  46 + else:
  47 + return request.host_url.rstrip("/")
  48 +
  49 +
40 class DataManager(BlueprintApi): 50 class DataManager(BlueprintApi):
41 bp = Blueprint("Auth", __name__, url_prefix="/auth") 51 bp = Blueprint("Auth", __name__, url_prefix="/auth")
42 52
@@ -136,25 +146,30 @@ class DataManager(BlueprintApi): @@ -136,25 +146,30 @@ class DataManager(BlueprintApi):
136 request=request2) 146 request=request2)
137 redirect_uri = grant1.validate_authorization_request() 147 redirect_uri = grant1.validate_authorization_request()
138 access_token = request.args.get("accesstoken") 148 access_token = request.args.get("accesstoken")
139 - accesstoken = OAuth2Token.query.filter_by(  
140 - access_token=access_token).first()  
141 - accesstoken.revoked = True  
142 - db.session.commit()  
143 - user = current_user()  
144 - remove_user()  
145 149
146 - # 日志  
147 - log = OAuthLog(user_id=user.id, username=user.username,  
148 - auth_type=AuthEnum.Other.name.lower(),  
149 - message="注销成功", create_time=datetime.now(),  
150 - operate_type=OperateEnum.Logout, token=access_token,  
151 - displayname=user.displayname, ip=request.remote_addr  
152 - )  
153 - db.session.add(log)  
154 - db.session.commit() 150 + if not access_token == None:
  151 + accesstoken = OAuth2Token.query.filter_by(
  152 + access_token=access_token).one_or_none()
  153 + if not accesstoken == None:
  154 + accesstoken.revoked = True
  155 + db.session.commit()
  156 + if current_user() != None:
  157 + remove_user()
  158 +
  159 + user = User.query.get(accesstoken.user_id)
  160 + # 日志
  161 + if user != None:
  162 + log = OAuthLog(user_id=user.id, username=user.username,
  163 + auth_type=AuthEnum.Other.name.lower(),
  164 + message="注销成功", create_time=datetime.now(),
  165 + operate_type=OperateEnum.Logout, token=access_token,
  166 + displayname=user.displayname, ip=request.remote_addr
  167 + )
  168 + db.session.add(log)
  169 + db.session.commit()
155 170
156 except OAuth2Error as error: 171 except OAuth2Error as error:
157 - return jsonify(dict(error.get_body())) 172 + StructurePrint().print(error.__str__()+":" + traceback.format_exc(), "error")
158 return redirect(redirect_uri) 173 return redirect(redirect_uri)
159 174
160 """接口""" 175 """接口"""
@@ -255,8 +270,9 @@ class DataManager(BlueprintApi): @@ -255,8 +270,9 @@ class DataManager(BlueprintApi):
255 client = oauth2.WebApplicationClient( 270 client = oauth2.WebApplicationClient(
256 configure.OA["client_id"]) 271 configure.OA["client_id"])
257 state = client.state_generator() 272 state = client.state_generator()
  273 + StructurePrint().print(request.headers, "info")
258 auth_uri = client.prepare_request_uri( 274 auth_uri = client.prepare_request_uri(
259 - configure.OA["authorization_endpoint"], configure.OA["redirect_uri"], configure.OA["scope"], state) 275 + configure.OA["authorization_endpoint"], getRedirectUrl(request) + configure.OA["redirect_uri"], configure.OA["scope"], state)
260 session["oauth_state"] = state 276 session["oauth_state"] = state
261 return redirect(auth_uri) 277 return redirect(auth_uri)
262 278
@@ -267,7 +283,7 @@ class DataManager(BlueprintApi): @@ -267,7 +283,7 @@ class DataManager(BlueprintApi):
267 @bp.route("/oa/callback", methods=["GET"]) 283 @bp.route("/oa/callback", methods=["GET"])
268 def oa_callback(): 284 def oa_callback():
269 try: 285 try:
270 - print(request.remote_addr) 286 + auth_default_redirect_uri = configure.auth_default_redirect_uri
271 client = oauth2.WebApplicationClient( 287 client = oauth2.WebApplicationClient(
272 configure.OA["client_id"]) 288 configure.OA["client_id"])
273 289
@@ -280,7 +296,7 @@ class DataManager(BlueprintApi): @@ -280,7 +296,7 @@ class DataManager(BlueprintApi):
280 296
281 # 获取token 297 # 获取token
282 body = client.prepare_request_body( 298 body = client.prepare_request_body(
283 - code, redirect_uri=configure.OA["redirect_uri"], client_secret=configure.OA["client_secret"]) 299 + code, redirect_uri=getRedirectUrl(request) + configure.OA["redirect_uri"], client_secret=configure.OA["client_secret"])
284 300
285 r = requests.post(configure.OA["token_endpoint"], body, headers={ 301 r = requests.post(configure.OA["token_endpoint"], body, headers={
286 "Content-Type": "application/x-www-form-urlencoded"}) 302 "Content-Type": "application/x-www-form-urlencoded"})
@@ -289,7 +305,6 @@ class DataManager(BlueprintApi): @@ -289,7 +305,6 @@ class DataManager(BlueprintApi):
289 access_token = tokeninfo.get("access_token") 305 access_token = tokeninfo.get("access_token")
290 id_token = tokeninfo.get("id_token") 306 id_token = tokeninfo.get("id_token")
291 307
292 - auth_default_redirect_uri = configure.auth_default_redirect_uri  
293 origin_type = "dci_oa" # 三方登录标识 308 origin_type = "dci_oa" # 三方登录标识
294 if access_token: 309 if access_token:
295 # 获取用户信息 310 # 获取用户信息
@@ -27,18 +27,19 @@ class Api(ApiTemplate): @@ -27,18 +27,19 @@ class Api(ApiTemplate):
27 res["result"] = False 27 res["result"] = False
28 try: 28 try:
29 # 业务逻辑 29 # 业务逻辑
30 - username = AESHelper.decode( self.para.get("username", '')) 30 + username = AESHelper.decode(self.para.get("username", ''))
31 password = SM3.encode(AESHelper.decode(self.para.get("pwd", ''))) 31 password = SM3.encode(AESHelper.decode(self.para.get("pwd", '')))
32 role = AESHelper.decode(self.para.get("role", '')) 32 role = AESHelper.decode(self.para.get("role", ''))
33 company = AESHelper.decode(self.para.get("company", '')) 33 company = AESHelper.decode(self.para.get("company", ''))
34 position = AESHelper.decode(self.para.get("position", '')) 34 position = AESHelper.decode(self.para.get("position", ''))
35 email = AESHelper.decode(self.para.get("email", '')) 35 email = AESHelper.decode(self.para.get("email", ''))
36 phone = AESHelper.decode(self.para.get("phone", '')) 36 phone = AESHelper.decode(self.para.get("phone", ''))
  37 + displayname = username
37 # 是否重名 38 # 是否重名
38 if(User.query.filter_by(username=username).one_or_none()): 39 if(User.query.filter_by(username=username).one_or_none()):
39 res["msg"] = "username 已存在" 40 res["msg"] = "username 已存在"
40 else: 41 else:
41 - user = User(username=username, password=password, role=role, 42 + user = User(username=username, displayname=displayname, password=password, role=role,
42 phone=phone, company=company, position=position, email=email, 43 phone=phone, company=company, position=position, email=email,
43 create_time=time.strftime( 44 create_time=time.strftime(
44 "%Y-%m-%d %H:%M:%S", time.localtime()), 45 "%Y-%m-%d %H:%M:%S", time.localtime()),
@@ -55,7 +55,7 @@ class Api(ApiTemplate): @@ -55,7 +55,7 @@ class Api(ApiTemplate):
55 {"name": "database_guid", 55 {"name": "database_guid",
56 "in": "formData", 56 "in": "formData",
57 "type": "string", 57 "type": "string",
58 - "description": "数据库guid", "": "true"}, 58 + "description": "数据库guid", "required": "true"},
59 59
60 ], 60 ],
61 "responses":{ 61 "responses":{
@@ -33,7 +33,7 @@ OA = { @@ -33,7 +33,7 @@ OA = {
33 "client_id": "dmap", 33 "client_id": "dmap",
34 "client_secret": "secret", 34 "client_secret": "secret",
35 "scope": "openid profile", 35 "scope": "openid profile",
36 - "redirect_uri": "http://localhost:8841/auth/oa/callback", 36 + "redirect_uri": "/auth/oa/callback",
37 "authorization_endpoint": "https://login.chinadci.com/netsso/connect/authorize", 37 "authorization_endpoint": "https://login.chinadci.com/netsso/connect/authorize",
38 "token_endpoint": "https://login.chinadci.com/netsso/connect/token", 38 "token_endpoint": "https://login.chinadci.com/netsso/connect/token",
39 "userinfo_endpoint": "https://login.chinadci.com/netsso/connect/userinfo", 39 "userinfo_endpoint": "https://login.chinadci.com/netsso/connect/userinfo",
@@ -77,4 +77,8 @@ result=AESHelper.decode(encryption) @@ -77,4 +77,8 @@ result=AESHelper.decode(encryption)
77 77
78 [验证码基础知识](https://baike.baidu.com/item/%E9%AA%8C%E8%AF%81%E7%A0%81/31701) 78 [验证码基础知识](https://baike.baidu.com/item/%E9%AA%8C%E8%AF%81%E7%A0%81/31701)
79 [使用python图像处理标准库](https://www.liaoxuefeng.com/wiki/1016959663602400/1017785454949568) 79 [使用python图像处理标准库](https://www.liaoxuefeng.com/wiki/1016959663602400/1017785454949568)
80 -[pillow](https://pillow.readthedocs.io/en/stable/index.html)  
  80 +[pillow](https://pillow.readthedocs.io/en/stable/index.html)
  81 +
  82 +
  83 +## 5 使用编译文件的方法
  84 +cmd下运行./compile.py
注册登录 后发表评论