【问题标题】:Getting error in token based authentication in python eve在 python eve 中获取基于令牌的身份验证错误
【发布时间】:2015-07-05 13:17:56
【问题描述】:

我正在使用基于令牌的身份验证,以便登录用户访问我的网站 API。

我收到以下错误。

{"_status": "ERR", "_error": {"message": "Please provide proper credentials", "code": 401}}

我将用户名、密码、电子邮件、令牌存储到我的人员架构中。

    "token" : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U",

"username": <username>,
"password": <password>,
"email": <email>

我正在使用以下方式对我的令牌进行编码

def create_token(user):
payload = {
    'sub': str(user['_id']),
    'iat': datetime.now(),
    'exp': datetime.now() + timedelta(days=14)
}

token = jwt.encode(payload, TOKEN_SECRET)
return token.decode('unicode_escape')

用户成功登录后,通过以下方式将我的返回令牌更新到数据库中

accounts = app.data.driver.db['people']
 accounts.update({'email': request.json['email']},{"$set":{'token':token}})

My Token 认证功能如下图。

class TokenAuth(TokenAuth):
def check_auth(self, token, allowed_roles, resource, method):
    accounts = app.data.driver.db['people']
    return accounts.find_one({'token': token})

以下方式包含我的TokenAuth。

app = Eve(__name__,static_url_path='/static', auth=TokenAuth)

通过以下方式使用 curl 发送请求

curl -X GET "http://127.0.0.1:8000/api/people" -H "Content-Type: application/json" -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U"

出现以下错误

{"_status": "ERR", "_error": {"message": "Please provide proper credentials", "code": 401}}

【问题讨论】:

    标签: python authentication jwt eve


    【解决方案1】:

    我使用了这两个函数:

    def headers(token, etag=False):
       headers = { 
                'Content-type': 'application/json; charset=utf-8',
                'Accept': 'application/json',
                'Authorization': authorization(token)
            }   
        if etag:
            headers['If-Match'] = etag
        return headers
    
    
    def authorization(token):
        import base64
        return 'Basic ' + str(base64.b64encode(token + ':'))
    

    这对我有用

    【讨论】:

    • 我需要在哪里定义这两个函数以及何时需要调用它们。
    • 我的服务器代码定义在以下链接 [link] github.com/suryamuppalla/forsatya/blob/master/server.py
    • 通过 curl 您的上述答案正在完美执行。在服务器如何从前端接收令牌,我不知道。
    • 我使用这个函数来连接 Eve 服务器。我为 HTTP 请求制作了正确的标头
    【解决方案2】:

    我正在使用以下 url 来获取 Logged User id。

    @app.route('/api/me')
    @login_required
    def me():
        return Response(json.dumps(g.user_id),  mimetype='application/json'
    

    使用以下代码向用户发送加密令牌。

    def create_token(user):
    payload = {
       'sub': str(user['_id']),
       'iat': datetime.now(),
       'exp': datetime.now() + timedelta(days=14)
    }
    
      token = jwt.encode(payload, TOKEN_SECRET)
    return token.decode('unicode_escape')
    

    所以我的问题是如何加密上述答案的令牌

      Basic base64.encode(token+':') format in my code
    

    执行以下操作时出现以下错误

    'Basic ' + str(base64.b64encode(token + ':'))
    

    错误是:

    decoder error not enough segments for api/me url 
    

    【讨论】:

      【解决方案3】:

      我认为问题可能出在:

      curl -X GET "http://127.0.0.1:8000/api/people" -H "Content-Type: application/json" -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U"
      

      尤其是:

      -H "Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U"
      

      我认为应该是:Basic + base64(token+':')

      我在python中使用这个函数:

      def authorization(token):
          return 'Basic ' + str(base64.b64encode(token + ':'))
      
      In [6]: token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0MzAxMzg4NTQsInN1YiI6IjU1M2RlMjcwYmVkMDY5MTYwOWRiMWRkNyIsImV4cCI6MTQzMTM0ODQ1NH0.-H8m19tWeOgDXcem9pNjD3XXefMgGKv-ao3U8W9_P1U"
      
      In [7]: print 'Basic ' + str(base64.b64encode(token + ':'))
      Basic ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBZWFFpT2pFME16QXhNemc0TlRRc0luTjFZaUk2SWpVMU0yUmxNamN3WW1Wa01EWTVNVFl3T1dSaU1XUmtOeUlzSW1WNGNDSTZNVFF6TVRNME9EUTFOSDAuLUg4bTE5dFdlT2dEWGNlbTlwTmpEM1hYZWZNZ0dLdi1hbzNVOFc5X1AxVTo=
      

      尔格:

      -H "Authorization: Basic ZXlKaGJHY2lPaUpJVXpJMU5pSXNJblI1Y0NJNklrcFhWQ0o5LmV5SnBZWFFpT2pFME16QXhNemc0TlRRc0luTjFZaUk2SWpVMU0yUmxNamN3WW1Wa01EWTVNVFl3T1dSaU1XUmtOeUlzSW1WNGNDSTZNVFF6TVRNME9EUTFOSDAuLUg4bTE5dFdlT2dEWGNlbTlwTmpEM1hYZWZNZ0dLdi1hbzNVOFc5X1AxVTo="
      

      【讨论】:

        猜你喜欢
        • 2015-07-02
        • 1970-01-01
        • 2021-01-25
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多