[Django] 手動登錄沒有密碼的用戶


Answers

丹尼爾的回答非常好。

另一種方法是在自定義授權後端創建一個HashModelBackend https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#writing-an-authentication-backend像這樣:

class HashModelBackend(object):
    def authenticate(self, hash=None):
        user = get_user_from_hash(hash)
        return user

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

然後在你的設置中安裝:

AUTHENTICATION_BACKENDS = (
    'myproject.backends.HashModelBackend',
    'django.contrib.auth.backends.ModelBackend',
)

那麼你的看法是這樣的:

def activate_account(request, hash):
    user = authenticate(hash=hash)
    if user:
        # check if user is_active, and any other checks
        login(request, user)
    else:
        return user_not_found_bad_hash_message
Question

我希望你能幫助我找到最好的方法來實現手動(服務器端啟動)登錄, 而不使用密碼。 讓我解釋一下工作流程:

  • 用戶註冊
  • 謝謝! 帶有激活鏈接的電子郵件已發送給blablabla
  • (帳戶現在存在但標記為未啟用)
  • 用戶打開電子郵件,點擊鏈接
  • (帳號已啟用)
  • 謝謝! 您現在可以使用該網站

我想要做的就是在用戶點擊電子郵件鏈接後登錄,以便他可以立即開始使用網站。

我不能使用他的密碼,因為它是在數據庫中加密,是唯一的選擇寫一個自定義身份驗證後端?




你可以使用ska包,它具有無密碼登錄到Django實現。 ska與認證令牌一起工作,其安全性基於SHARED_KEY,對於涉及的所有方(服務器)應該是相等的。

在客戶端(請求無密碼登錄的一方),您使用ska生成一個URL並對其進行簽名。 例:

from ska import sign_url
from ska.contrib.django.ska.settings import SECRET_KEY

server_ska_login_url = 'https://server-url.com/ska/login/'

signed_url = sign_url(
    auth_user = 'test_ska_user_0',
    secret_key = SECRET_KEY,
    url = server_ska_login_url
    extra = {
        'email': 'john.doe@mail.example.com',
        'first_name': 'John',
        'last_name': 'Doe',
    }
    )

標記的默認生存期為600秒。 您可以通過證明lifetime參數來自定義。

在服務器端(用戶登錄的站點),考慮到你已經正確安裝了ska ,當用戶訪問URL(用戶名匹配)或者其他方式創建URL時,用戶就登錄了。 您可以在項目的Django設置中自定義3個回調。

USER_GET_CALLBACK(string):如果用戶從數據庫(現有用戶)成功獲取,則觸發。 USER_CREATE_CALLBACK(字符串):在用戶創建後(用戶不存在)觸發。 USER_INFO_CALLBACK(字符串):成功驗證時觸發。

有關更多信息,請參閱文檔( http://pythonhosted.org/ska/ )。