微信小程序程序员微信小程序

使用django开发微信小程序后端

2017-01-15  本文已影响11131人  weidwonder

tips: 本文面向的对象是已经会使用django开发web后端的人员

微信小程序后端与普通web的区别

微信小程序的后端开发和普通的restful API 大致上相同,只不过要注意以下几点限制

应对方法

看起来好像步骤很多, 但是我们没有必要去重新造轮子, 早有人已经写好认证流程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_userrequest.jwt_session, 这里你需要设置的只有设置两个值: USER_TO_PAYLOADPAYLOAD_TO_USER两个方法:
* USER_TO_PAYLOAD: 根据当前登录的用户生成一个字典payload方法
* PAYLOAD_TO_USER: 根据你之前生成的payload找到对应的用户

注: 2017.1.15我这个组件还没有完整的readme, 后续会加上

最后, 关于认证器, 如果你使用rest-framework可以直接继承BaseAuthenticationauthenticate方法里校验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
上一篇下一篇

猜你喜欢

热点阅读