2014-10-08 44 views
1

Settings.py:蟒蛇前夕tokenauth 401錯誤

RESOURCE_METHODS = ['GET', 'POST', 'DELETE'] 

ITEM_METHODS = ['GET', 'PATCH', 'PUT', 'DELETE'] 

schema = { 
    'username': { 
     'type': 'string', 
     'required': True, 
    }, 
    'password': { 
     'type': 'string', 
     'required': True, 
    }, 
    'roles': { 
     'type': 'list', 
     'allowed': ['user', 'admin'], 
     'required': True, 
    }, 
    'token': { 
     'type': 'string', 
     'required': True, 
    } 
} 

accounts = { 
    'additional_lookup': { 
     'url': 'regex("[\w]+")', 
     'field': 'username' 
    }, 
    'cache_control': '', 
    'cache_expires': 0, 
    'allowed_roles': ['sudo', 'admin', 'user'], 
    'extra_response_fields': ['token'], 
    'schema': schema 
} 

DOMAIN = { 
    'accounts': accounts, 
} 

run.py:

from eve import Eve 
from eve.auth import TokenAuth 
import random 
import string 


class RolesAuth(TokenAuth): 
    def check_auth(self, token, allowed_roles, resource, method): 
     # use Eve's own db driver; no additional connections/resources are used 
     accounts = app.data.driver.db['accounts'] 
     lookup = {'token': token} 
     if allowed_roles: 
      #only retrieve a user if his roles match ``allowed_roles`` 
      lookup['roles'] = {'$in': allowed_roles} 
     account = accounts.find_one(lookup) 
     return account 


def add_token(documents): 
    # Don't use this in production: 
    # You should at least make sure that the token is unique. 
    for document in documents: 
     document["token"] = (''.join(random.choice(string.ascii_uppercase) 
             for x in range(10))) 


if __name__ == '__main__': 
    app = Eve(auth=RolesAuth) 
    app.on_insert_accounts += add_token 
    app.run() 

的MongoDB(賬催收):

db.accounts.find({username:"prova"}) 
{ "_id" : ObjectId("num"), "username" : "prova", "password" : "prova", "roles" : "admin", "token" : "blabla" } 

CMD(cHJvdmE6YmxhYmxhprova:blabla) :

我的問題是,我得到一個401錯誤,告訴我認證是錯誤的。
我也試過只用base64編碼的令牌,但沒有改變。有任何想法嗎?
我使用的是Eve-0.4和Eve-0.5。

回答

1

使用令牌認證您只需要傳遞實際的令牌與您的請求:沒有用戶名,沒有密碼。在測試你的代碼時,我可以看到token的值是prova,而你想要blabla(這是實際的令牌值)。

您可以通過在check_auth中添加pdb斷點來驗證自己。因此,請嘗試使用YmxhYmxhOg==(blabla)和您的身份驗證請求標頭。

+0

謝謝Nicola! :) – polslinux 2014-10-12 19:49:07