gpt4 book ai didi

ruby-on-rails - 门卫刷新 token 不会因重复使用而过期

转载 作者:行者123 更新时间:2023-12-03 14:48:30 25 4
gpt4 key购买 nike

我正在使用 Doorkeeper 5.2.1,我咨询了 Doorkeeper docs on refresh tokens并阅读了几个与刷新 token 相关的 GitHub 问题和拉取请求,特别是 herehere .

根据我从这些对话和阅读规范(和 documents and posts referencing the spec )中收集到的信息,以下陈述是正确的:

  • 刷新 token 是长期存在的(与访问 token 相反,访问 token 通常在相对较短的 TTL 后过期)
  • 授权服务器可以实现撤销
  • Doorkeeper 在某些基础上实现了刷新 token 撤销(虽然我不清楚是什么,请继续阅读)

  • 不过,我很困惑,基于 this pull request ,它在“使用该刷新 token 创建的访问 token 成功使用一次”后实现刷新 token 到期。 Doorkeeper 如何知道我是否已成功使用该访问 token 发出 API 请求?是我的 API 根据该访问 token 计算授权逻辑。 Doorkeeper 不知道我的 API 请求是否成功。但是,我已经将其解释为如果 resource_owner_authenticator块返回一个用户,这可能构成成功使用。但是我还没有发现刷新 token 成功过期。 (请参阅下面的我的规范。)

    它也出现在阅读 this spec file如果您成功使用刷新 token ,它会撤销之前的刷新 token ,这是有道理的。

    不过,我正在尝试在我的规范文件中解决所有这些问题,但我遇到了一个问题,即刷新 token 似乎没有被撤销,即使它被多次使用,或者它(“刷新 token A") 在与刷新 token A 用于生成的访问 token 一起返回的刷新 token (“ token B”)也被使用后被重用。我的规范文件将使这一点更清楚:
    describe 'OAuth flow' do
    # ...
    describe 'refresh tokens' do

    # ...
    context 'when attempting reuse of a refresh token' do
    before do
    redirect_uri = 'https://localhost:3002'

    # ivars necessary brecause plaintext tokens/secrets are only available upon creation of the object
    @client = Doorkeeper::Application.create(name: 'foo', uid: 'bar', redirect_uri: redirect_uri, scopes: 'project_index')
    @secret = @client.plaintext_secret
    @grant = Doorkeeper::AccessGrant.create(resource_owner_id: user.id, organization_id: org.id, application_id: @client.id, scopes: 'project_index', expires_in: 600, redirect_uri: redirect_uri)
    @code = @grant.plaintext_token
    end

    it 'revokes the initial refresh token' do
    # Get an initial access token and refresh token
    post "/oauth/token?client_id=#{@client.uid}&client_secret=#{@secret}&code=#{@code}&grant_type=authorization_code&redirect_uri=#{@client.redirect_uri}&scope=project_index"
    expect(response.status).to eq(200)

    # Use refresh token to get a new access token
    previous_refresh_token = JSON.parse(response.body)['refresh_token']

    post "/oauth/token?client_id=#{@client.uid}&client_secret=#{@secret}&code=#{@code}&grant_type=refresh_token&refresh_token=#{previous_refresh_token}&redirect_uri=#{@client.redirect_uri}&scope=project_index"
    expect(response.status).to eq(200)
    json_body = JSON.parse(response.body)
    new_access_token = json_body['access_token']
    new_refresh_token = json_body['refresh_token']

    # Use the new access token successfully
    get "/api/v1/projects?access_token=#{new_access_token}"
    expect(response.status).to eq(200)

    # Use the new refresh token to get yet another access token
    post "/oauth/token?client_id=#{@client.uid}&client_secret=#{@secret}&code=#{@code}&grant_type=refresh_token&refresh_token=#{new_refresh_token}&redirect_uri=#{@client.redirect_uri}&scope=project_index"
    expect(response.status).to eq(200)

    # Attempt reuse of the first refresh token
    post "/oauth/token?client_id=#{@client.uid}&client_secret=#{@secret}&code=#{@code}&grant_type=refresh_token&refresh_token=#{previous_refresh_token}&redirect_uri=#{@client.redirect_uri}&scope=project_index"
    expect(response.status).to eq(400)

    # ^^^ fails, response is 200 and a new access token and refresh token are generated
    end
    end
    end

    # ...
    end

    此规范在最后一个断言中失败,这表明对于给定的刷新 token ,当它用于生成的访问 token 成功使用时(与上述内容相反),或者当刷新 token 随刷新的访问一起发布时,它不会被撤销 token 被使用。

    我的问题是,对于 Doorkeeper,刷新 token 在什么情况下会被撤销?

    最佳答案

    守门人实现了一些流程,其中发行的 token 应该被撤销。 (我怀疑我描述了所有这些,我只记得那些)

  • 通过心甘情愿地制作 request撤销给定的 token 。
  • 通过完成 refresh token flow ,这将撤销刷新的 token 。 (除非启用了第三个流)
  • 通过成功 completing an authentication同时启用刷新 token 流并通过列 previous_refresh_token在您的 oauth_access_tokens table 。在刷新 token 流期间,此列由 doorkeeper 通过正在刷新的当前 token (变为前一个 token )自动填充。 (必须在看门人配置上启用此流程)
  • Revoking a grant token ,用作其他流的预身份验证。一旦用于获取另一个 token (例如客户端或访问 token ),授权 token 就会被撤销
  • 在客户端凭据流上,通过请求一个禁用重用访问 token 配置的新 token

  • 基于我不得不说的所有这些,你的假设是完全正确的。您编写的规范应该撤销 token ,这让我想到这是否不是看门人的错误。如果没有看到你的看门人配置,我会猜测,但是,我发现了这个拉取请求 #1341从版本 5.3.0hash_token_secrets 出现时,应该修复一个关于撤销刷新 token 的错误。已启用。如果您有 hash_token_secrets启用尝试禁用它或更新门卫。如果这些都不可能,请尝试制作猴子补丁(作为最后的资源),看看是否能解决您的问题。

    关于ruby-on-rails - 门卫刷新 token 不会因重复使用而过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58271861/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com