首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在并发环境中刷新访问令牌?

如何在并发环境中刷新访问令牌?
EN

Stack Overflow用户
提问于 2015-09-27 01:35:08
回答 1查看 1.2K关注 0票数 2

任务是通过服务到服务认证机制查询谷歌服务之一,该机制假设每60分钟获得一次新的访问令牌。因此,它需要主动刷新或刷新失败的请求。

最新的技术似乎是一种防御性的技术,不符合长生不老的哲学。此外,无法确定请求是否由于访问令牌过期而失败,或者因为提供的凭据(电子邮件和密钥)通常无效--这将是相同的文本和相同的401代码。

也许有人能就执行策略提出建议?这将是主机应用程序打算使用的库,并且假定在令牌刷新期间(可能是90‘s?)新请求将被创建,一般情况下,它们等待新令牌而不是使用即将过时的令牌会更好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-27 07:53:33

一般来说,在Elixir/Erlang中,大约有4种存储和使用共享数据的方法:

  1. GenServer或者类似的--您实现了包含密钥的过程,并且也查询了API。您向它发送一条消息,它将返回数据。您不必担心数据来自何处、使用了哪些键以及如何使用。请求是序列化的(不是并行的),这可能是您不想要的。
  2. 代理-只保存数据(密钥)。你打电话给Agent.get/3,然后拿钥匙。每当您发现密钥过期时,就调用Agent.update/3将新密钥放入代理。或者你总是调用update/3。
  3. ETS桌-最后一招。如果你没有好的理由,不要使用它。
  4. 任何外部来源-你可以从磁盘,网络等,甚至最后;)采取措施。

对于您的使用,第一个和第二个解决方案可能几乎是等价的。但我会使用第二个,因为平行化。你可以写这样的东西:

代码语言:javascript
运行
复制
defmodule TokenHolder do

  def start_link(user,passwd) do
    Agent.start_link(fn ->
      tok_time = get_token user, passwd
      {user,passwd,tok_time} 
    end, name: __MODULE__)
  end

  # refresh the token if older that one hour
  @max_age 60*60*1000000

  def token do
    Agent.get_and_update(__MODULE__, fn state={user,passwd,{token,retrieved}} ->
      now = :os.timestamp
      if(:timer.now_diff(now, retrieved) < @max_age) do
        # return old token and old state
        {token,state}
      else
        # retrieve new token, return it and return changed state
        tok_time = {token,_} = get_token user, passwd
        {token,{user,passwd,tok_time}}
      end
    end)
  end

  defp get_token(user,passwd) do
    token = ... # retrieve token somehow...
    {token,:os.timestamp}
  end

end

那你就这么做:

代码语言:javascript
运行
复制
{:ok,_} = TokenHolder.start_link("user","secret")
token = TokenHolder.token
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32803723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档