def wrapper(*args, **kwargs): """実際の処理を書くための関数 Args: *args, **kwargs: funcの引数 Returns: funcの返り値 """ logger = getLogger("django") # sessionの中にユーザ情報があればユーザ名を取得 try: user = args[1].session['user']['preferred_username'] except (AttributeError, KeyError): user = '******' post_data = args[1].data logger.info("%s module start", str(args[0].__class__)) logger.info("%s post_data user: \"%s\" body: %s", str(args[0].__class__), user, post_data) start_time = time() try: result = func(*args, **kwargs) except WebAppException as err: # funcのエラーハンドリング elapsed_time = time() - start_time logger.error(err, exc_info=True) logger.error("%s module killed -> elapsed time: %ss", str(args[0].__class__), elapsed_time) response(status.HTTP_500_INTERNAL_SERVER_ERROR, message='内部エラー') else: elapsed_time = time() - start_time logger.info("%s module completed -> elapsed time: %ss", str(args[0].__class__), elapsed_time) return result
def after_login(self, request): """Azure ad でリダイレクトで戻ってくるエンドポイント用service Args: request(object): クライアントより送られてきたHttp情報 Returns: object: クライアントに返却するResonse情報 """ if request.GET.get('state') != request.session.get('state'): # 'state' がリクエスト時と一致しない return redirect('https://' + settings.DOMAIN + '/') if 'error' in request.GET: # Azure AD が認証/認可エラーを返した return response(http_status=status.HTTP_401_UNAUTHORIZED, message='Azure Adで認証エラーが発生しました') if 'code' in request.GET: cache = self._load_cache(request) result = self._build_msal_app( cache=cache ).acquire_token_by_authorization_code( request.GET['code'], scopes=settings. SCOPES, # Misspelled scope would cause an HTTP 400 error here redirect_uri=settings.REDIRECT_PATH) if 'error' in result: return response( http_status=status.HTTP_401_UNAUTHORIZED, message='Azureとの認証確認でエラーが発生しました', ) request.session['user'] = result.get('id_token_claims') # Azure AD 側の oid とアプリ側の external_id が一致するユーザーがいるか確認する azure_preferred = request.session['user']['preferred_username'] user = UserRepository().get_user(azure_preferred) if user is None: return response(http_status=status.HTTP_401_UNAUTHORIZED, message='DBにユーザが登録されていないか重複しています') # sessionに必要情報を詰める self._set_session(request, user) # pathがあればリダイレクト path = 'https://' + settings.DOMAIN + '/' if 'next' in request.session: path = 'https://' + settings.DOMAIN + request.session['next'] return redirect('https://' + settings.DOMAIN + '/')
def get(self, request): """GetのテストをするAPIエンドポイントの関数 Args: request(object): Pクライアントより送られてきたHttp情報 Returns: object: クライアントに返却するResonse情報 """ body = {'test': "test"} return response(response_body=body)
def post(self, request): """DBのselectをするAPIエンドポイントの関数 Args: request(object): POSTでクライアントより送られてきたHttp情報 Returns: object: クライアントに返却するResonse情報 """ service_resp = SampleService().sample_create(request) return response(status.HTTP_200_OK, response_body=service_resp)
def get_user_info(self, request): """ユーザ情報取得用エンドポイントの関数 Args: request(object): POSTでクライアントより送られてきた情報 Returns: object: Viewに返却するResonse情報 """ user_data = UserInfo().get_user_info(request) selializer = UserInfoSerializer(user_data) return response(response_body=selializer.data)
def dummy_login(self, request): """tset用のdummy loginをするAPIエンドポイントの関数 Args: request(object): クライアントより送られてきたHttp情報 Returns: object: Viewを経由してクライアントに返却するResonse情報 """ # key確認 if 'preferred_username' not in request.data: return response(http_status=status.HTTP_401_UNAUTHORIZED, message='preferred_usernameがありません') # Azure AD 側の oid とアプリ側の external_id が一致するユーザーがいるか確認する azure_preferred = request.data['preferred_username'] user = UserRepository().get_user(azure_preferred) if user is None: return response(http_status=status.HTTP_401_UNAUTHORIZED, message='DBにユーザが登録されていないか重複しています') # sessionに必要情報を詰める self._set_session(request, user) if not request.session.session_key: request.session.save() body = { 'session_id': request.session.session_key, 'user_id': request.session['system_cache']['user_id'], 'user_name': request.session['system_cache']['user_name'], 'user_section': request.session['system_cache']['user_section'], 'user_category_list': request.session['system_cache']['user_category_list'] } return response(response_body=body)
def pre_login(self, request): """DBのselectをするAPIエンドポイントの関数 Args: request(object): クライアントより送られてきたHttp情報 Returns: object: Viewを経由してクライアントに返却するResonse情報 """ if 'state' not in request.session: request.session['state'] = str(uuid.uuid4()) auth_url = self._build_auth_url(scopes=settings.SCOPES, state=request.session['state']) selializer = LoginSerializer(LoginResponse(auth_url)) return response(response_body=selializer.data)