2017-04-05 138 views
-2

我已經通過Flask視圖構建了一個API,用戶使用一些端點在/api/v1/....處訪問。我想認證提出請求的用戶。什麼是強制使用我的API進行身份驗證的方法?有沒有辦法避免構建用戶模型,而是使用Google或基於Github的身份驗證?基於Flask的API的身份驗證?

+1

我認爲Flask-OAuth或Flask-OAtuthlib會有幫助。 – stamaimer

回答

1

我使用flask-login攔截具有會話的Web請求和具有標題的Web請求。來自Web的請求使用Flask的會話,來自移動應用程序的請求會發送一個標題。

這些方法返回給定請求的用戶。 API token由其危險簽名(防篡改),從而爲Flask的cookies提供支持。

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