Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2FA Log In #868

Closed
MorganFujimaka opened this issue May 25, 2023 · 2 comments
Closed

2FA Log In #868

MorganFujimaka opened this issue May 25, 2023 · 2 comments

Comments

@MorganFujimaka
Copy link

What would be the best strategy to test API having a 2FA login (e.g. Okta via Authlib)?

Is it possible to log in using django.test.Client rather than API and have the logged-in user in the following stages?:

from django.test import Client

client.login(username, password)
@MorganFujimaka MorganFujimaka changed the title Log In with 2FA testing 2FA Log In May 25, 2023
@michaelboulton
Copy link
Member

I haven't used Django for a while but I think there's 2 options to do this: Either write a fixture that logs in using the django client and get the cookies:

import http.cookies
from django.test import Client


def django_cookies(client: Client) -> http.cookies.SimpleCookie:
    client.login("username", "password")

    return client.cookies
---
test_name: Use Django client to create cookies

marks:
  - usefixtures: django_login

stages:
  - name: Do a request with cookies
    request:
      url: "{host}/thing"
      method: GET
    cookies:
      - my_cookie_name: "{django_cookies.my_cookie_name}"

If that doesn't work, you'd probably have to write a plugin that
logged in via the Django authentication system and then used the client to do all future http requests

@MorganFujimaka
Copy link
Author

Hi @michaelboulton, thank you for the prompt reply.

I haven't tried writing a custom plugin, but passing a sessionid in cookies works like a charm. The issue is that I have many tests, and passing the cookies with every request looks tedious. I tried to use the pytest_tavern_beta_before_every_request hook, but it didn't work.

So, I decided to mock OAuth:

from unittest import mock

class MockOAuth():
    class MockOktaUserInfoResponse():
        def __init__(self, email):
            self.email = email


        def raise_for_status(*args, **kwargs):
            return None


        def json(self):
            if self.email:
                return { "email": self.email }
            else:
                return {}


    class MockOkta():
        def authorize_access_token(self, request):
            return request.POST.get("email")


        def get(self, userinfo_uri, token):
            return MockOAuth.MockOktaUserInfoResponse(email=token)


    def __init__(self):
        self.okta = MockOAuth.MockOkta()


    def register(*args, **kwargs):
        return True


@pytest.fixture(autouse=True)
def mock_okta():
    with mock.patch("authlib.integrations.django_client.OAuth", new=MockOAuth):
        yield

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants