Git Product home page Git Product logo

Comments (4)

saeedghx68 avatar saeedghx68 commented on May 19, 2024

I implement by this code

from sanic_jwt.endpoints  import AuthenticateEndpoint
from sanic_openapi import doc

class LoginSwDoc:
    username = doc.String("Username", required=True)
    password = doc.String("Password", required=True)

# add swagger doc to sanic JWT method
AuthenticateEndpoint.decorators.extend([
    doc.summary("Authenticate user and get token"),
    doc.consumes(LoginSwDoc, location='body'),
    doc.produces(LoginSwDoc),
    doc.consumes({'AUTHORIZATION': str}, location='header'),
])

from sanic-openapi.

nomed avatar nomed commented on May 19, 2024

Hi,

tried on sanic 20.9.0 with no success.

Is it supposed to work also on more recent releases ?

from sanic-openapi.

digitalkaoz avatar digitalkaoz commented on May 19, 2024

this was my attempt:

def document_auth_bp():
    from sanic_jwt.endpoints import RetrieveUserEndpoint, AuthenticateEndpoint, VerifyEndpoint, RefreshEndpoint

    inner_me = RetrieveUserEndpoint.get

    @doc.summary("returns the user for this JWT Token")
    @doc.consumes({'AUTHORIZATION': str}, location='header')
    @doc.produces(User)
    async def doc_me(self, request, *args, **kwargs):
        return await inner_me(self, request, *args, **kwargs)

    RetrieveUserEndpoint.get = doc_me

    inner_auth = AuthenticateEndpoint.post

    @doc.summary("login a user")
    @doc.consumes(doc.JsonBody({
        "username": doc.String("the username"),
        "password": doc.String("the password"),
    }), location="body")
    @doc.response(401, None, description="invalid credentials")
    @doc.response(200, {"access_token": str, "refresh_token": str}, description="the token to use for api interaction")
    async def doc_auth(self, request, *args, **kwargs):
        return await inner_auth(self, request, *args, **kwargs)

    AuthenticateEndpoint.post = doc_auth

    inner_verify = VerifyEndpoint.get

    @doc.summary("verifies a JWT")
    @doc.consumes({'AUTHORIZATION': str}, location='header')
    @doc.response(401, None, description="Token is invalid or expired")
    @doc.response(200, {"valid": True}, description="Token is valid")
    async def doc_verify(self, request, *args, **kwargs):
        return await inner_verify(self, request, *args, **kwargs)

    VerifyEndpoint.get = doc_verify

    inner_refresh = RefreshEndpoint.post

    @doc.summary("generates a new access token with the refresh token")
    @doc.consumes({'AUTHORIZATION': str}, location='header')
    @doc.consumes(doc.JsonBody({
        "refresh_token": doc.String("the refresh token"),
    }), location="body")
    @doc.response(401, None, description="Token is invalid or expired")
    @doc.response(200, {"access_token": str}, description="the new access token")
    async def doc_refresh(self, request, *args, **kwargs):
        return await inner_refresh(self, request, *args, **kwargs)

    RefreshEndpoint.post = doc_refresh

document_auth_bp()

jwt = Initialize(
    app,
    ...
)

i feel pretty dirty right now, but it works, would love to see a cleaner solution!

@nomed

from sanic-openapi.

quadhead avatar quadhead commented on May 19, 2024

My solution:

sanicjwt = Initialize(
    app,
    ...
)

for route in sanicjwt.bp.routes:
    view = route.handler.view_class
    for http_method in route.methods:
        h = getattr(view, http_method.lower(), None)
        if h:
            name = route.handler.__name__
            d = doc.route_specs[h]
            if name == "AuthenticateEndpoint":
                d.summary = "Authenticate user and get token"
            if name == "RetrieveUserEndpoint":
                d.summary = "Retrieve current user"
            if name == "VerifyEndpoint":
                d.summary = "Verify token"
            if name == "RefreshEndpoint":
                d.summary = "Generate new token using refresh token"

Seems a little bit more elegant...

from sanic-openapi.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.