调用 API 时使用 JWT 承载认证

Posted

技术标签:

【中文标题】调用 API 时使用 JWT 承载认证【英文标题】:Using JWT Bearer Authentication When Call API 【发布时间】:2021-11-24 03:52:41 【问题描述】:

我想访问已购买产品的 API,我根据产品文档使用了以下代码:

var client = new RestClient("http://example.com/api/login");

client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddParameter("username", "admin");
request.AddParameter("password", "admin");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);

文档说:

身份验证通过 JWT Bearer 执行 验证。每个端点都需要身份验证,因此您将 需要在每个请求中添加以下标头

Authorization: Bearer <JWT>

如何在我的上层请求中添加 JWT 认证?

【问题讨论】:

能否请您链接文档?您很可能无法使用用户名和密码生成 JWT Bearer 令牌,因为这更适合基本身份验证。您很可能需要首先使用您的用户名和密码调用另一个身份验证端点,服务器将生成一个不记名令牌并返回它,然后您可以在后续请求中使用该令牌来授权您的请求。 @ErmiyaEskandary 这是文档,请不要从语言列表中选择 c# documenter.getpostman.com/view/11765341/U16byA2y 感谢阿卜杜勒萨拉姆!这有帮助,我已经发布了一个答案 - 如果它能让你走上正确的轨道,请告诉我? 【参考方案1】:

根据documentation you've provided 的Access Granted Client Credentials 部分,您需要调用承载令牌的端点是/admin/api/index.php/api/login

使用正确的凭据调用该端点将使用以下 JSON 填充您的 response.Content


  "status": 200,
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9kZW1vNC5zYXNyYWRpdXMuY29tXC9hZG1pblwvYXBpXC9pbmRleC5waHBcL2FwaVwvbG9naW4iLCJpYXQiOjE2MzA0MDU5OTgsImV4cCI6MTYzMDQwOTU5OCwibmJmIjoxNjMwNDA1OTk4LCJqdGkiOiJCZmdvN00zN2pkbGtRRzFhIiwic3ViIjoxLCJwcnYiOiJkNzk3N2M0N2U5MTY5NjUxMDEwNzM0ZDJmYmY4Y2MxMzlmM2U1MDM0In0.7tNWgF6psOPKpPC9-zU_hEK_GLx3-BeFlIW9LE4wzYo"

将上述 JSON 对象反序列化为令牌对象,token 字段将成为您的 JWT 令牌。

Token.cs

public class Token

    public int status  get; set; 
    public string token  get; set; 

var tokenObj = JsonConvert.DeserializeObject<Token>(response.Content);
string token = tokenObj.token;

对于后续请求,要进行身份验证,请添加此行,您应该一切顺利。

request.AddHeader("Authorization", $"Bearer token");

【讨论】:

我收到“内部服务器错误” @AbdulsalamElsharif 我无法提供更多信息,但您的网址正确吗?您的用户名和密码正确吗?您关于如何在 RestSharp 请求上设置不记名令牌的原始问题已得到解答。【参考方案2】:
request.AddHeader("Authorization", $"Bearer Token");

【讨论】:

如何获取Token? 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:***.com/help/how-to-answer。祝你好运?

以上是关于调用 API 时使用 JWT 承载认证的主要内容,如果未能解决你的问题,请参考以下文章

支持 JWT 密钥轮换的承载令牌认证的 Owin 中间件

使用JWT来做后台认证api支撑(jwt

zuul:不接受承载认证

laravel dingo/api添加jwt-auth认证

Yii2 Rest API 承载认证

JWT 实现基于API的用户认证