网友真实露脸自拍10p,成人国产精品秘?久久久按摩,国产精品久久久久久无码不卡,成人免费区一区二区三区

小程序模板網

使用django開發微信小程序后端

發布時間:2018-02-01 18:27 所屬欄目:小程序開發教程

微信小程序后端與普通web的區別

微信小程序的后端開發和普通的restful API 大致上相同,只不過要注意以下幾點限制

  • 必須使用HTTPS協議請求后端服務器
  • 不支持COOKIE
  • 不支持django內置的user登錄, 因為它使用的是微信的用戶系統

應對方法

  • 對于HTTPS的限制, 很簡單, 去godaddy等網站申請一個https證書, 下載后使用nginx指定即可, 可以參照此文章, 這篇文章的證書是自己生成的, 這里需要替換為申請的證書

  • 不支持cookie, django原生的session機制就會失效

  • 不支持django內置的user登錄, 因為它使用的是微信的用戶系統

    對于上邊這兩個問題,我使用了JWT來保證了用戶的在線驗證. 那么什么是JWT呢, 可以看下推酷的這篇文章了解一下, 簡要的來說就是用戶登錄以后, 原先保存在cookie里邊的一個隨機的sessionid變成了保存在http頭部的Authorization字段的一個token值, 這個值是服務端自身加密的, 客戶端無需解密, 只要服務端知道這個token對應這個用戶就好, 當然這里也有很多的附加功能, 比如超時等等, 不再贅述

    然而網上有很多的jwt開源項目, 比如django-jwt, rest-framework-jwt, 你都可以使用, 但是卻不適用于微信小程序, 為什么這么說? 是因為這兩個項目都和django內置的user相耦合, 在上邊提出的第三個問題的地方會引起問題, 在嘗試了rest-framework-jwt發現問題后, 我毅然決定自己使用pyjwt實現一個用戶登錄/鑒權的組件.

    首先要知道微信小程序的登錄流程是:

    1. 客戶端請求用戶授權
    2. 用戶授權成功
    3. 客戶端或得到用戶基本信息(包括code,沒有openid的用戶明文信息, 有openid的加密后的信息, 解密向量iv)
    4. 客戶端把返回的信息發送到服務器
    5. 服務器使用code去微信服務器換取session_key
    6. 服務器用這個session_key+iv去解密用戶密文, 得到用戶完整信息(基本+openid)
    7. 將用戶在服務器登錄, 維持用戶session(這里的失效時間微信約定是30天)

    看起來好像步驟很多, 但是我們沒有必要去重新造輪子, 早有人已經寫好認證流程python-weixin我們可以省去4-6的步驟, 那么剩下的問題就是如何解決第7步也就是維持session的問題了.

因為jwt始終使用http頭部的token進行驗證這里我的思路是:

  1. 微信用戶登錄后, 返回客戶端token, 并在緩存創建用戶的session信息
  2. 客戶端請求時附加http頭Authorization=JWT <token>
  3. 使用中間件檢驗http頭的token, 審查通過則在request上追加一個jwt_user屬性(這里不想覆蓋django自帶user), 同時去緩存尋找這個用戶的session信息, 加載到request.jwt_session, 審查如果不通過則jwt_user設置為None, jwt_session為一個空的session對象
  4. 使用認證方法, 對于需要進行登錄的接口檢驗用戶是否為None

到這一步就已經完成了整個的用戶鑒權/session持久化流程, 如果你只是為了了解django開發小程序注意的點到這里已經可以結束了, 下邊我要介紹的是我實現的一套中間件邏輯, 有興趣可以拿去直接使用.

這里中間件我已經實現了參見django-jwt-session-auth, 調用模塊內部的jwt_login函數, 登錄你的用戶時會返回一個token, 這個token將要返回客戶端, 同時它也會做user的session緩存動作.下一次客戶端帶著Authorization=JWT <token>調用的時候中間件會直接將對應的user和session加載到request.jwt_user和request.jwt_session, 這里你需要設置的只有設置兩個值: USER_TO_PAYLOAD和PAYLOAD_TO_USER兩個方法:

* USER_TO_PAYLOAD: 根據當前登錄的用戶生成一個字典payload方法
* PAYLOAD_TO_USER: 根據你之前生成的payload找到對應的用戶

注: 2017.1.15我這個組件還沒有完整的readme, 后續會加上

最后, 關于認證器, 如果你使用rest-framework可以直接繼承BaseAuthentication在authenticate方法里校驗jwt_user是否為None即可, 如果直接使用django原生的view, 可以寫一個裝飾器裝飾在類view的dispatch方法上或直接裝飾在函數的view上.

示例

# django-jwt-session-auth設置, 放在settings.py文件中
JWT_AUTH = {
    'PAYLOAD_TO_USER': 'user.auth.payload_to_user',
    'USER_TO_PAYLOAD': 'user.auth.user_to_payload',
}

# rest-framework驗證器
class WechatUserAuthentication(BaseAuthentication):
    def authenticate(self, request):
        if not request.jwt_user:
            msg = u'請先授權'
            raise exceptions.AuthenticationFailed(msg)
        return (request.jwt_user, request.jwt_user.uuid)

# 原生django驗證裝飾器
def login_required(func):
    @wraps(func)
    def verify_login(request, *args, **kwargs):
        if request.jwt_user:
            return func(request, *args, **kwargs)
        else:
            # 返回HTTP_401
    return verify_login


易優小程序(企業版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://www.xiuhaier.com/wxmini/doc/course/21399.html 復制鏈接 如需定制請聯系易優客服咨詢:800182392 點擊咨詢
QQ在線咨詢
AI智能客服 ×