美文网首页
使用jwt来实现登录注册身份认证

使用jwt来实现登录注册身份认证

作者: dc630f46ee2d | 来源:发表于2017-12-31 02:12 被阅读0次

    配置django rest framework jwt

    1. github下载
    https://github.com/GetBlimp/django-rest-framework-jwt
    
    1. 进入虚拟环境
    export VIRTUALENVWRAPPER_PYTHON='/usr/local/bin/python3'
    export WORKON_HOME='/Users/zhouming/Documents'
    source /usr/local/bin/virtualenvwrapper.sh
    workon VueShop
    
    1. 使用pip进行安装
      pip install djangorestframework-jwt

    2. 在setting中设置

    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.BasicAuthentication',
            'rest_framework.authentication.SessionAuthentication',
            'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        )
    }
    

    其中

    'rest_framework.authentication.BasicAuthentication',
    'rest_framework.authentication.SessionAuthentication',
    

    是默认的认证机制,就算不在setting中设置,依然会默认使用这个认证机制。我们添加了其实只有'rest_framework_jwt.authentication.JSONWebTokenAuthentication'

    1. 配置url路由
    from rest_framework_jwt.views import obtain_jwt_token
    #...
    
    urlpatterns = [
        '',
        # ...
    
        url(r'^api-token-auth/', obtain_jwt_token),
    ]
    

    使用 postman来模拟获取jwt token和token认证过程

    1. 创建jwt token
      url: http://127.0.0.1:8000/api-token-auth/
      post 方式
      body类型 序列化的json字符串 application/json
      body值
    {
        "username": "zhouming",
        "password": "Mmix1009"
    }
    

    输出结果

    {
        "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo0LCJ1c2VybmFtZSI6Inpob3VtaW5nIiwiZXhwIjoxNTE0NjU2NjE5LCJlbWFpbCI6Ijk0MDgyNTg5N0BxcS5jb20ifQ._2rHky8yHeUD9b02_Azk3lZzhO2OiWgj5s_oHShNWeY"
    }
    
    1. 使用jwt token来请求api
      测试api,可以使用任何api,除了本身获取token的api
      http://127.0.0.1:8000/api-token-auth/
      请求这个api服务器会输出如下响应。
    {
        "username": [
            "该字段是必填项。"
        ],
        "password": [
            "该字段是必填项。"
        ]
    }
    

    我们用goods api来做请求吧。

    3.在app中发起请求,抛出下面问题

    RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and you have APPEND_SLASH set.
    post请求要用 /作为结尾。
    Post请求中为什么要添加
    [self.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // header上加入key为content-type值为application/json的项
    实际作用是为post请求添加了一个header.key 为 Content-Type ,值application/json,告诉服务器客户端是使用application/json方法进行的编码。
    但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。所以说到 POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分.

    总结

    1. 获取token的api中不能测试是否用token认证
    2. debug request.user 可以获取当前用户到底是什么用户。

    相关文章

      网友评论

          本文标题:使用jwt来实现登录注册身份认证

          本文链接:https://www.haomeiwen.com/subject/qfkogxtx.html