免费国产欧美国日产_少妇AV一区二区三区无码_蜜桃精品av无码喷奶水小说_jk18禁网站视频_精产国品一二三级产品区别_被夫の上司に犯波多野结衣_78m成人手机免费看_最爽最刺激18禁视频_偷偷色噜狠狠狠狠的777米奇

易優(yōu)GEO 重磅上線 ~ 一站式GEO優(yōu)化工具,讓豆包、文心一言、DeepSeek 在回答中主動(dòng)推薦你的品牌,搶占AI流量入口!  點(diǎn)擊查看

小程序模板網(wǎng)

使用django開(kāi)發(fā)微信小程序后端

發(fā)布時(shí)間:2018-02-01 18:27 所屬欄目:小程序開(kāi)發(fā)教程

微信小程序后端與普通web的區(qū)別

微信小程序的后端開(kāi)發(fā)和普通的restful API 大致上相同,只不過(guò)要注意以下幾點(diǎn)限制

  • 必須使用HTTPS協(xié)議請(qǐng)求后端服務(wù)器
  • 不支持COOKIE
  • 不支持django內(nèi)置的user登錄, 因?yàn)樗褂玫氖俏⑿诺挠脩?hù)系統(tǒng)

應(yīng)對(duì)方法

  • 對(duì)于HTTPS的限制, 很簡(jiǎn)單, 去godaddy等網(wǎng)站申請(qǐng)一個(gè)https證書(shū), 下載后使用nginx指定即可, 可以參照此文章, 這篇文章的證書(shū)是自己生成的, 這里需要替換為申請(qǐng)的證書(shū)

  • 不支持cookie, django原生的session機(jī)制就會(huì)失效

  • 不支持django內(nèi)置的user登錄, 因?yàn)樗褂玫氖俏⑿诺挠脩?hù)系統(tǒng)

    對(duì)于上邊這兩個(gè)問(wèn)題,我使用了JWT來(lái)保證了用戶(hù)的在線驗(yàn)證. 那么什么是JWT呢, 可以看下推酷的這篇文章了解一下, 簡(jiǎn)要的來(lái)說(shuō)就是用戶(hù)登錄以后, 原先保存在cookie里邊的一個(gè)隨機(jī)的sessionid變成了保存在http頭部的Authorization字段的一個(gè)token值, 這個(gè)值是服務(wù)端自身加密的, 客戶(hù)端無(wú)需解密, 只要服務(wù)端知道這個(gè)token對(duì)應(yīng)這個(gè)用戶(hù)就好, 當(dāng)然這里也有很多的附加功能, 比如超時(shí)等等, 不再贅述

    然而網(wǎng)上有很多的jwt開(kāi)源項(xiàng)目, 比如django-jwt, rest-framework-jwt, 你都可以使用, 但是卻不適用于微信小程序, 為什么這么說(shuō)? 是因?yàn)檫@兩個(gè)項(xiàng)目都和django內(nèi)置的user相耦合, 在上邊提出的第三個(gè)問(wèn)題的地方會(huì)引起問(wèn)題, 在嘗試了rest-framework-jwt發(fā)現(xiàn)問(wèn)題后, 我毅然決定自己使用pyjwt實(shí)現(xiàn)一個(gè)用戶(hù)登錄/鑒權(quán)的組件.

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

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

    看起來(lái)好像步驟很多, 但是我們沒(méi)有必要去重新造輪子, 早有人已經(jīng)寫(xiě)好認(rèn)證流程python-weixin我們可以省去4-6的步驟, 那么剩下的問(wèn)題就是如何解決第7步也就是維持session的問(wèn)題了.

因?yàn)閖wt始終使用http頭部的token進(jìn)行驗(yàn)證這里我的思路是:

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

到這一步就已經(jīng)完成了整個(gè)的用戶(hù)鑒權(quán)/session持久化流程, 如果你只是為了了解django開(kāi)發(fā)小程序注意的點(diǎn)到這里已經(jīng)可以結(jié)束了, 下邊我要介紹的是我實(shí)現(xiàn)的一套中間件邏輯, 有興趣可以拿去直接使用.

這里中間件我已經(jīng)實(shí)現(xiàn)了參見(jiàn)django-jwt-session-auth, 調(diào)用模塊內(nèi)部的jwt_login函數(shù), 登錄你的用戶(hù)時(shí)會(huì)返回一個(gè)token, 這個(gè)token將要返回客戶(hù)端, 同時(shí)它也會(huì)做user的session緩存動(dòng)作.下一次客戶(hù)端帶著Authorization=JWT <token>調(diào)用的時(shí)候中間件會(huì)直接將對(duì)應(yīng)的user和session加載到request.jwt_user和request.jwt_session, 這里你需要設(shè)置的只有設(shè)置兩個(gè)值: USER_TO_PAYLOAD和PAYLOAD_TO_USER兩個(gè)方法:

* USER_TO_PAYLOAD: 根據(jù)當(dāng)前登錄的用戶(hù)生成一個(gè)字典payload方法
* PAYLOAD_TO_USER: 根據(jù)你之前生成的payload找到對(duì)應(yīng)的用戶(hù)

注: 2017.1.15我這個(gè)組件還沒(méi)有完整的readme, 后續(xù)會(huì)加上

最后, 關(guān)于認(rèn)證器, 如果你使用rest-framework可以直接繼承BaseAuthentication在authenticate方法里校驗(yàn)jwt_user是否為None即可, 如果直接使用django原生的view, 可以寫(xiě)一個(gè)裝飾器裝飾在類(lèi)view的dispatch方法上或直接裝飾在函數(shù)的view上.

示例

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

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

# 原生django驗(yàn)證裝飾器
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


易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開(kāi)源 碼云倉(cāng)庫(kù):starfork
本文地址:http://www.szcjxy.com/wxmini/doc/course/21399.html 復(fù)制鏈接 如需定制請(qǐng)聯(lián)系易優(yōu)客服咨詢(xún): 點(diǎn)擊咨詢(xún)
在線客服