2017-04-05 2 views
-2

Flask보기를 통해 API를 구축했으며 사용자는 /api/v1/....에서 일부 끝점을 사용하여 액세스합니다. 요청하는 사용자를 인증하고 싶습니다. 내 API로 인증을 시행하는 방법은 무엇입니까? 사용자 모델을 구축하지 않고 Google 또는 Github 기반 인증을 사용하는 방법이 있습니까?Flask 기반 API 인증?

+1

나는 Flask-OAuth 또는 Flask-OAtuthlib가 도움이 될 것이라고 생각합니다. – stamaimer

답변

1

나는 flask 요청을 가로 채고 헤더가있는 세션과 세션 요청을 가로 채고 있습니다. 웹의 요청은 Flask의 세션을 사용하며 모바일 앱의 요청은 헤더를 보냅니다.

이 메소드는 주어진 요청에 대해 사용자를 반환합니다. API 토큰은 위험한 것으로 서명 (변조 방지)되어 있으며, 이는 Flask의 쿠키를 강화합니다.

from itsdangerous import URLSafeSerializer, BadData 
serializer = URLSafeSerializer(CONFIG['SECRET_KEY']) 


def load_user_from_request(request): 
    token = request.headers.get('API-TOKEN') 
    if token: 
     try: 
      user_id = serializer.loads(token)["id"] 
      user = User.query.filter(User.active == True, User.id == int(user_id)).first() 
      if user: 
       return user 
     except BadData as e: 
      pass 
    return None 


def load_user(id): 
    user = User.query.filter(User.active == True, User.id == int(id)).first() 
    if not user: 
     return None 
    return user 

login_manager.user_loader(load_user) 
login_manager.request_loader(load_user_from_request) 

이 엔드 포인트는 인증 요청에 소요되는 사용자 이름과 암호 문제 토큰을 확인합니다. 그 위험한 시리얼 라이저는 당신의 객체의 변조 방지 버전을 만든다. 클라이언트는 헤더와 동일하게 제출합니다. 앱의 비밀 키가 안전하다면 서버는 서명 된 객체가 서버에서 발행되었음을 확인할 수 있습니다.

@blueprint.route('/api_auth', methods=["post"]) 
def api_auth(): 
    ...check username and password 
    return response({ 
     'API-TOKEN': serializer.dumps({'id': user.id}) 
    }) 
+0

감사! 로컬 사용자 모델을 사용하고있는 것처럼 보입니다. 타사 인증 시스템을 사용하는 동안 다른 사람이 비슷한 것을 구현했는지 궁금합니다. – orange1

+0

사용자 "모델"이 어떤 데이터베이스에 있어야하는 이유는 없습니다. Flask-login은 로그인 동작을위한 API를 사용할 수 있습니다. – aitchnyu