在身份服务器 4 中,如何读取保存在数据库中的加密刷新令牌(字符串)以获取访问令牌?



我有一个身份服务器 4 池(2 台服务器(,一台服务器正在颁发访问令牌 (JWT( 和一个刷新令牌,刷新令牌保存在数据库表中。持久授权表(。现在,当访问令牌过期时,我想从第二个服务器读取刷新令牌并调用 RequestRefreshTokenAsync 来取回一组新的令牌。如何在应用程序中读取数据库刷新令牌?

我不确定这是否是您要问的,但是客户端中的refresh_token被转换为 IdentityServer4PersistedGrants表上的数据库Id使用以下代码,我相信我前段时间已经从 IdentityServer4 的源代码中提取:

using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace HandleToKey
{
internal class Program
{
private static void Main(string[] args)
{
if (args.Length < 1)
{
Console.WriteLine("No argument provided, you may want to provide with a token handle.");
Console.WriteLine("Usage: HandleToKey.exe [tokenHandle]");
}
else
{
var input = args.First();
using (var sha = SHA256.Create())
{
input = $"{input}:refresh_token";
var bytes = Encoding.UTF8.GetBytes(input);
var hash = sha.ComputeHash(bytes);
var result = Convert.ToBase64String(hash);
Console.WriteLine(result);
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
}
}
}
}

相关字节是其中的代码,我认为(我不记得了(是用于在实际源代码中创建和查询持久授权的代码,或与之类似的代码。它将输入与":refresh_token"连接起来,使用 UTF8 charmap 获取byte[],并计算其SHA256哈希,然后将其编码为 Base64,结果应该是 Id。

您还可以通过将字符串更改为":access_token"而不是 refresh_token 来获得具有 access_token 引用的相同结果。

无论如何,我只将其用于调试目的。我希望您避免在生产站点使用此代码,因为如果您让我们了解更多有关它的信息,我相信有更好的方法来解决您的实际问题。

最新更新