c# - 如何获取 Cylance 用户 API 的访问令牌?
问题描述
我想使用 Cylance 用户 API。我从他们那里得到了 C# 示例代码来使用,但他们告诉我他们不会回答任何问题。
这是我用于获取访问令牌的代码:
private const int TimeoutSecs = 1800;
private static void Main()
{
const string tenantId = "..."; // Tenant Id. The "..." are the real values of course. I just deleted them here because this is no info which belongs in the internet.
const string appId = "...";
const string appSecret = "..."; // Application secret.
var utcNow = DateTime.UtcNow;
var jwtClaims = new JwtClaims
{
jti = Guid.NewGuid().ToString(),
iat = utcNow.ToUnixTimestamp(),
exp = utcNow.AddSeconds(TimeoutSecs).ToUnixTimestamp(),
iss = "http://cylance.com",
tid = tenantId,
sub = appId
};
try
{
var authToken = GenerateAuthorizationToken(jwtClaims, appSecret);
Console.WriteLine($"\n[Authorization Token]\n{authToken}\n");
var accessToken = GenerateAccessToken(authToken);
Console.WriteLine($"\n[Access Token]\n{accessToken}\n");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.WriteLine("Press <Enter> to exit...");
Console.ReadLine();
}
private static string GenerateAuthorizationToken(JwtClaims jwtClaims, string appSecret)
{
if (jwtClaims == null)
{
throw new ArgumentNullException(nameof(jwtClaims));
}
if (string.IsNullOrWhiteSpace(appSecret))
{
throw new ArgumentException(nameof(appSecret));
}
var algorithm = new HMACSHA256Algorithm();
var serializer = new JsonNetSerializer();
var encoder = new JwtBase64UrlEncoder();
var jwt = new JwtEncoder(algorithm, serializer, encoder);
return jwt.Encode(jwtClaims, appSecret);
}
private static string GenerateAccessToken(string authToken)
{
if (string.IsNullOrWhiteSpace(authToken))
{
throw new ArgumentException(nameof(authToken));
}
const string authEndpoint = "https://protectapi.cylance.com/auth/v2/token";
var authRequest = new AuthTokenRequest
{
AuthToken = authToken
};
var authTask = authEndpoint
.PostJsonAsync(authRequest)
.ReceiveJson<AuthTokenResponse>();
Task.WaitAll(authTask);
var authResponse = authTask.Result;
return authResponse.AccessToken;
}
}
internal sealed class AuthTokenRequest
{
[JsonProperty("auth_token")]
public string AuthToken { get; set; }
}
internal sealed class AuthTokenResponse
{
[JsonProperty("access_token")]
public string AccessToken { get; set; }
}
internal sealed class JwtClaims
{
public long exp { get; set; }
public long iat { get; set; }
public string iss { get; set; }
public string sub { get; set; }
public string jti { get; set; }
public string tid { get; set; }
}
但是当我调用 main 时会引发异常(实际上 auth_token-text 更大,但由于与上述相同的原因,我将其删除):
POST https://protectapi.cylance.com/auth/v2/token failed with status code 401 (Unauthorized).
Request body:
{"auth_token":"ey...
...wQQ"}
Response body:
{"message":"Invalid JWT payload"}
关于响应消息“无效的 JWT 有效负载”,我认为我在创建 AuthorizationToken 时做错了,但我不知道是什么。
解决方案
问题是,autentfification 端点的 url 是错误的。所以这是正确的行(在函数中:GenerateAccessToken)
const string authEndpoint = "https://protectapi-euc1.cylance.com/auth/v2/token";
因为我来自欧洲 - 中部。
这是文档中描述的服务端点的完整列表:
推荐阅读
- javascript - RSA-SHA1 签名在 JavaScript 和 PHP 中不同
- c - 查找程序卡在哪里 C
- python - 从字符串创建嵌套列表
- ffmpeg - 将 hls 文件切割成许多小的“.ts”文件或保留一个大的“.ts”文件。哪个更好?
- python - 如何在 python 中使用训练有素的 Tensorflow Lite 模型?
- python - 我可以使用另一个类内部的函数中的变量吗?
- javascript - 在 JavaScript 中使用 Selenium 处理“接受 Cookie”弹出窗口
- react-native - 发送正文 React Native - PHP
- javascript - TypeError:无法读取未定义 discord.js 的属性“解决”
- windows - 从 Bat 文件中的 .tar 文件中获取特定文件