“刷新令牌”的目的是什么?

274

我有一个与YouTube直播API集成的程序。它运行定时器,因此相对容易编程,在50分钟内获取新的Access Token和Refresh Token。我的问题是,为什么这样做?

当我通过YouTube进行身份验证时,它提供了一个Refresh Token。然后,我使用该Refresh Token每小时左右获取一个新的Access Token。如果我拥有Refresh Token,我可以始终使用它来获取新的Access Token,因为它永远不会过期。因此,我不明白为什么这比一开始就给我一个Access Token并且不费力地使用整个Refresh Token系统更加安全。


2
请参见 https://dev59.com/5nA75IYBdhLWcg3wFEsI#57503520。 - mfaani
47
访问令牌是“持有人”令牌。这意味着不需要其他标识,访问令牌就足以冒充你。因此,它们应该始终短暂存在。另一方面,刷新令牌不是“持有人”令牌。当您向YouTube发送刷新令牌以获取新的访问令牌时,还必须发送client_id和client_secret。因此,刷新令牌可以保留更长时间,因为很少有可能同时泄露刷新令牌和client_secret。 - jmrah
11
为什么刷新令牌和客户端密钥不太可能被破解?所有令牌,包括访问令牌,在发送时都经过 HTTPS 加密,因此我认为它们始终是加密的。 - Olle Härstedt
7
我猜@OlleHärstedt的意思是,相较于访问令牌,减少了被攻击者以两种方式受到威胁的可能性。首先,因为刷新令牌在传输过程中花费的时间要少得多,攻击者进行中间人攻击(或其他类型的攻击)获取刷新令牌的机会更少。其次,如果攻击者要获取服务器的访问权限,则需要获取3个信息(令牌、ID和密钥),而不是只有一个(访问令牌),理论上看起来更难做到。 - jmrah
1
令牌也可以与IP地址绑定,这样可以增加额外的安全层。 - Peru
11个回答

0

这是一个很好的学习经验,并对令牌、刷新令牌和缓存有了一些了解。然而,(我很好奇,这里不提供任何建议)我们是否可以使用在使用 Microsoft Identity 平台时返回的代码?我们是否只需存储CodeIdToken并在需要时使用它来获取新的访问令牌?因为我认为如果我们使用它来获取访问令牌,那么每次都应该使用它来重新生成访问令牌。

 ...
 ResponseType = OpenIdConnectResponseType.CodeIdToken,
...

并且

private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification context)
    {
        IConfidentialClientApplication clientApp = MsalAppBuilder.BuildConfidentialClientApplication();
        AuthenticationResult result = await clientApp.AcquireTokenByAuthorizationCode(new[] { "User.Read" }, context.Code)
          .ExecuteAsync();
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接