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

Posted

技术标签:

【中文标题】如何使用 authlib 保存和重用令牌【英文标题】:How to save and reuse tokens with authlib 【发布时间】:2021-12-15 19:11:13 【问题描述】:

我是 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 here
    return token


@app.get("/account")
async def get_account(request: Request):
    account_url = "https://some-service.com/account"
    resp = await oauth.some_service.get(account_url)
    return resp.json()

我想获取帐户信息。因此,进一步的步骤将是:

    GET /login

我正在授予使用我的帐户的权限,并将被重定向回我的服务。

    GET /auth?oauth_params1=foo&oauth_params2=bar

将从令牌提供者处获取令牌。我知道我错误地认为该令牌会以某种方式保存在某个地方。

    GET /account

我期望使用 OAuth 客户端可以发送以前获取的令牌。但是,我收到下一个错误:

authlib.integrations.base_client.errors.MissingTokenError: missing_token:

我也知道我应该提供这样的令牌:

oauth.some_service.get(account_url, token=previously_fetched_token)

但是,我不想每次都从some-service 询问令牌,我想重用令牌。该怎么做?

我错了,这个问题是authlib 范围的一部分吗?我应该找到缓存或数据库机制的解决方案吗?

p.s.:我也是FastAPI 的初学者...

【问题讨论】:

嘿@catscoolzhyk 你有进步吗? 【参考方案1】:

token 是一个具有多个值的对象-


  "oauth_token": "TOKEN ID",
  "oauth_token_secret": "SECRET TOKEN",
  "user_id": "USER ID",
  "screen_name": "USER SCREEN NAME"

你有几个选择-

使用具有这些值的数据库模型。使用“user_id”作为主键,因为“screen_name”可以由用户更改。 JSON 对整个对象进行编码并将其存储在某处。 将其放入一个 cookie 对象中,以便随每个请求一起发回。这样做的好处是您根本不必担心存储 oauth 令牌,但这意味着您无法在用户请求之外对其进行任何操作。

【讨论】:

以上是关于如何使用 authlib 保存和重用令牌的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 4 在 AJAX 模式中重用 CSRF 令牌

重用令牌 asp.net web api c#

如何保存 jwt 令牌以在下一个请求中使用?在nodejs中

如何在客户端上保存 JWT 令牌,在节点中使用 Hapi js。?

如何使用 iOS SDK 保存 LinkedIn 访问令牌?

每次请求后如何保存用户令牌[关闭]