标签: authlib

Starlette 会话状态清除

在处理一些 OAuth/0Auth 身份验证示例时,我在尝试清除 Starlette 会话状态(使用 starlette.middleware.sessions.SessionMiddleware)时发现了一些奇怪的行为。

在 Flask 中,以下注销时的会话清除代码工作得很好:

@app.route('/logout')
def logout():
    session.clear()
    params = {'returnTo': url_for('home', _external=True), 'client_id': AUTH0_CLIENT_ID}
    return redirect(auth0.api_base_url + '/v2/logout?' + urlencode(params))
Run Code Online (Sandbox Code Playgroud)

Starlette 中的等效项request.session.clear()无法清除会话状态,即使在注销代码运行后,我仍然可以访问所有受登录保护的页面,因为会话状态以某种方式保留!我已经注释了下面的代码 - 问题和解决方法。

async def logout(self, request):
    '''called when logout button is pressed - clear the session and redirect to root'''
    session = request.session      
    #session.clear()                # <- this doesn't achieve anything - session variables/cookies return on next request
    session.pop(PROFILE_KEY, None)  # <- popping just one of two works fine
    session.pop(JWT_PAYLOAD, None) …
Run Code Online (Sandbox Code Playgroud)

python authlib starlette

9
推荐指数
0
解决办法
1826
查看次数

哪个定时 JSONWebSignature 序列化器替代其危险更好?pyjwt 或 authlib

目前,我正在使用itsdangerous生成定时 json Web 签名作为用户进行身份验证和重置密码等的令牌。以下是代码:

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

class SampleCode:
    def generate_confirmation_token(self, expiration=600):
        s = Serializer(current_app.config['SECRET_KEY'], expires_in=expiration)
        return s.dumps({'confirm': self.id}).decode('utf-8')

    def confirm(self, token):
        s = Serializer(current_app.config['SECRET_KEY'])
        try:
            data = s.loads(token.encode('utf-8'))
        except:
            return False
        if data.get('confirm') != self.id:
            return False
        self.confirmed = True
        db.session.add(self)
        return True
Run Code Online (Sandbox Code Playgroud)

由于TimedJSONWebSignatureSerializer弃用并删除,itsdangerous 2.1.0我认为我可能需要转向提供 JWT/JWS 接口的其他一些库。

这里我有两个候选人,哪一个更好:

flask pyjwt itsdangerous authlib

7
推荐指数
1
解决办法
3766
查看次数

具有用于RESTfull API的社交网络的Python OAuth2服务器

我正在尝试使用Python和Falcon Web框架通过社交平台(Github,Facebook,Instagram)使用登录选项为RESTfull API实现OAuth2服务器.但我很难理解这件事应该如何运作.

我目前的理解使我得到以下方案: OAuth2授权方案(使用社交平台)

1.1.在API方面,我正在创建一个端点/auth/login/github,它基本上会告诉移动应用程序将客户端重定向到Github.com授权页面 - github.com/login/oauth/authorize 1.2.在Github授权页面上,用户将看到以下屏幕: Github授权页面 1.3.按下Authorize后,用户将callback使用新授予的临时授权代码进入参数(Github OAuth服务配置)中指定的页面.在我的情况下,URL将如下所示:my.api.com/auth/callback/github?code=AUTH_CODE

2.1.接收回调请求后,我解析/取出通过授权码,并以赎回从后端查询Github.com 授权代码并获得访问令牌(发送使用我的POST请求的客户端ID客户端密钥github.com/login/oauth/access_token)2.2.如果一切顺利,Github将使用访问令牌回复我的POST请求,我可以使用它来获取用户个人资料详细信息(例如电子邮件)

3.1.现在我知道通过Github的授权是成功的(因为我收到了用户的电子邮件),我可以向该用户授予我自己的访问令牌,这样他就可以查询我的API端点.我这样做只是通过添加随机生成OAuth2令牌并将其插入我的数据库,同时通过使用深层链接(例如:myapp:// token)将他重定向到移动应用程序,将相同的令牌返回给用户.3.2.最后,移动应用可以通过向每个请求添加以下标头来查询我的API端点Authorization: Bearer 0b79bab50daca910b000d4f1a2b675d604257e42

这是否有意义,这是否是对RESTfull API进行社交授权的正确方法?

我使用Falcon作为此项目的Web框架,使用Authlib作为OAuth2库.

python oauth oauth-2.0 falconframework authlib

6
推荐指数
1
解决办法
837
查看次数

如何使用 authlib 保存和重用令牌

我是authlib的初学者,并试图理解它的概念。

我尝试了解,如何保存和重用获取的令牌authlib

我创建了一个小FastAPI项目:

from fastapi import FastAPI
from starlette.config import Config
from starlette.middleware.sessions import SessionMiddleware
from starlette.requests import Request
from authlib.integrations.starlette_client import OAuth


app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key="some-random-secret")

config = Config(".env")
oauth = OAuth(config)

oauth.register(
    name="some_service",
    client_id="client_id",
    client_secret="client_secret",
    authorize_url="https://some-service.com/auth",
    access_token_url="https://some-service.com/token",
    client_kwargs={
        "token_endpoint_auth_method": "client_secret_post",
    },
)


@app.get("/login")
async def login(request: Request):
    redirect_uri = "https://myservice.com/auth"
    return await oauth.some_service.authorize_redirect(request, redirect_uri)


@app.get("/auth")
async def auth(request: Request):
    token = await oauth.some_service.authorize_access_token(request)
    # I suppose that I should save somehow token …
Run Code Online (Sandbox Code Playgroud)

python authlib starlette fastapi

5
推荐指数
1
解决办法
898
查看次数

Authlib 客户端错误:请求和响应中的状态不相等

我正在尝试实现authlib客户端和服务器。我以 OAuth2.0 示例为例,并按照教程在 Flask 站点上进行了我自己的客户端授权。这是我的代码:

from flask import Flask, redirect, url_for, session, request

from authlib.flask.client import OAuth
from authlib.client.errors import OAuthException

APP_ID = 'KBtRDO3r2HETjw4TcLznthoj'
APP_SECRET = '3g4C6nbJcTIYX3jyCIEmf6KE8h8pzxUhjy6ArlY3AEgj1snv'

app = Flask('testa_client')
app.debug = True
app.secret_key = 'development'

oauth = OAuth()
oauth.init_app(app)

remote = oauth.register(
    'testa',
    client_id=APP_ID,
    client_secret=APP_SECRET,
    # request_token_params={'scope': 'base'},
    base_url='http://127.0.0.1:5000',
    access_token_url='http://127.0.0.1:5000/auth/token',
    authorize_url='http://127.0.0.1:5000/auth/connect'
)


@app.route('/')
def index():
    return redirect(url_for('login'))


@app.route('/login')
def login():
    callback = url_for(
        'websa_authorized',
        next=request.args.get('next') or request.referrer or None,
        _external=True
    )
    return remote.authorize_redirect(callback=callback)


@app.route('/login/authorized')
def websa_authorized():
    resp …
Run Code Online (Sandbox Code Playgroud)

flask authlib

4
推荐指数
1
解决办法
5205
查看次数

如何使用 HTTPX / Starlette 关闭 Authlib 客户端的 SSL 验证?

无论我多么努力,我似乎​​都找不到一种方法让 Authlib / HTTPS 尊重自签名证书,所以我想在作为 OAuth 客户端发出请求时关闭 SSL 验证。我怎样才能做到这一点?看起来AUTHLIB_INSECURE_TRANSPORT像是一个只适合服务器的变量。

authlib

4
推荐指数
1
解决办法
6907
查看次数

生产中的Flask-oauthlib或authlib?

我刚刚在我正在建设的网站上工作了flask-oauthlib.但是,我注意到项目的首页有一个警告,要求使用authlib.

如果您在生产中使用flask-oauthlib,您是否计划迁移到authlib?是否有人知道这个迁移已完成的简单项目回购?我非常欣赏一些东西.

flask-oauthlib页面,注意警告:

https://flask-oauthlib.readthedocs.io/en/latest/

flask flask-oauthlib authlib

3
推荐指数
1
解决办法
1770
查看次数

通过授权码从lepture/Authlib获取Refresh Token

我正在尝试开发一个使用 Authlib OAuth2 服务器获取刷新令牌的简单工具,但此处的示例服务器不发出刷新令牌。当我打印令牌时,我得到以下信息:

{'access_token': '....', 'scope': 'profile', 'token_type': 'Bearer', 'expires_in': 864000, 'expires_at': 1532191887}
Run Code Online (Sandbox Code Playgroud)

流程是此处提到的授权代码;首先我处理同意部分:

client_id = '...'
client_secret = '.....'
scope = '...'
session = OAuth2Session(client_id, client_secret, scope=scope)
authorize_url = '.../oauth/authorize'
uri, state = session.authorization_url(authorize_url)
Run Code Online (Sandbox Code Playgroud)

然后我尝试获取令牌:

urlset = '.../?code=...&state=...'
access_token_url = '.../oauth/token'
token = session.fetch_access_token(access_token_url,authorization_response=urlset)    
Run Code Online (Sandbox Code Playgroud)

access-token oauth-2.0 refresh-token authlib

3
推荐指数
1
解决办法
608
查看次数

使用 Authlib 和 Flask 获取和存储刷新令牌

我正在使用 authlib https://github.com/lepture/authlib获取用户对其数据的身份验证,因此每日离线调度程序可以代表用户下载一些数据。

我首先注册客户端:

google = oauth.register(
    'google',
    client_id = '***',
    client_secret = '***',
    access_token_url = "https://www.googleapis.com/oauth2/v4/token", 
    access_token_params = None,
    authorize_url = "https://accounts.google.com/o/oauth2/v2/auth",
    authorize_params = None,
    api_base_url = 'https://googleapis.com/oauth2/v1/',
    client_kwargs={'scope': 'https://www.googleapis.com/auth/doubleclickbidmanager'}
)
Run Code Online (Sandbox Code Playgroud)

在稍后阶段,我使用以下方法检索令牌:

token = oauth.google.authorize_access_token()
Run Code Online (Sandbox Code Playgroud)

当我打印令牌时,我看到 Google 没有返回我需要存储在数据库中以供离线使用的刷新令牌:

{'access_token': '***', 'expires_in': 3599, 'scope': 'https://www.googleapis.com/auth/doubleclickbidmanager', 'token_type': 'Bearer', 'expires_at': 1591750317}
Run Code Online (Sandbox Code Playgroud)

我可以更改使用 access_type = offline 注册客户端的方式,以便让 Google 知道我也需要刷新令牌吗?如何获取和存储刷新令牌?

python flask oauth-2.0 authlib requests-oauthlib

3
推荐指数
1
解决办法
675
查看次数

MismatchingStateError: mismatching_state: CSRF 警告!请求和响应中的状态不相等

这让我非常疯狂,并阻止我进行本地开发/测试。

我有一个使用 authlib(仅限客户端功能)的烧瓶应用程序。当用户点击我的主页时,我的 Flask 后端会将他们重定向到 /login,然后又重定向到 Google Auth。Google Auth 然后将它们发回我的应用程序的 /auth 端点。

几个月来,我一直在遇到 authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF 警告的临时问题!状态在请求和响应中不相等。感觉就像一个 cookie 问题,大多数时候,我只是打开一个新的浏览器窗口或隐身或尝试清除缓存,最终,它有点工作。

但是,我现在在 docker 容器内运行完全相同的应用程序,并且在一个阶段这是有效的。我不知道我做了什么改变,但是每当我浏览到 localhost/ 或 127.0.0.1/ 并通过身份验证过程(每次清除 cookie 以确保我没有自动登录)时,我经常被重定向回 l​​ocalhost /auth?state=blah blah blah 我遇到了这个问题:authlib.integrations.base_client.errors.MismatchingStateError: mismatching_state: CSRF 警告!状态在请求和响应中不相等。

我认为我的代码的相关部分是:

@app.route("/", defaults={"path": ""})
@app.route("/<path:path>")
def catch_all(path: str) -> Union[flask.Response, werkzeug.Response]:
    if flask.session.get("user"):
        return app.send_static_file("index.html")
    return flask.redirect("/login")


@app.route("/auth")
def auth() -> Union[Tuple[str, int], werkzeug.Response]:
    token = oauth.google.authorize_access_token()
    user = oauth.google.parse_id_token(token)
    flask.session["user"] = user
    return flask.redirect("/")


@app.route("/login")
def login() -> werkzeug.Response:
    return oauth.google.authorize_redirect(flask.url_for("auth", _external=True))
Run Code Online (Sandbox Code Playgroud)

我将不胜感激任何帮助。 …

python flask docker authlib

2
推荐指数
3
解决办法
4586
查看次数

authorize_access_token 是否也验证 id 令牌?

为了检索 OAuth / OpenID Connect 令牌,该函数在authlib 文档authorize_access_token中使用。像 Google 这样的 OAuth 提供商强烈建议手动验证这些令牌,例如通过检查到期日期。

文档在哪里authorize_access_token?我在网站上找不到任何东西。该函数会自动验证令牌还是我必须自己验证令牌?

python oauth-2.0 authlib

1
推荐指数
1
解决办法
2011
查看次数