请求PoP令牌


layout: docs-default

请求 PoP 令牌

注意 文档处于beta版状态

PoP访问令牌可以作为申请授权码或者更新令牌流程的一部分
这个规格允许一系列的变异,但是IdentityServer现在仅支持客户端生成非对称密钥证据。

简单来说,它是这样工作的:

  1. 客户端生成一对密钥(比如:RSA或者EC)
  2. 客户端在申请访问令牌时把公钥发给IdentityServer
  3. identityserver 把密钥嵌入到访问令牌中(在cnf 声明中)
  4. 客户端用私钥签名HTTP请求,资源服务器使用公钥来验证访问令牌。

生成密钥对

// create key pair
var p = RsaPublicKeyJwk.CreateProvider();
var key = p.ExportParameters(false);

// package public key part as a JWK
var jwk = RsaPublicKeyJwk.CreateJwk(key);
var jwk64 = RsaPublicKeyJwk.CreateJwkString(jwk);

请求 PoP 令牌

首先通过授权码流程申请一个令牌,然后把公钥发随着令牌发过去。

var tokenClient = new TokenClient(
  IdentityServerPipeline.TokenEndpoint, 
  ClientId, 
  ClientSecret);

var tokenResponse = await tokenClient.RequestAuthorizationCodePopAsync(
  authResponse.Code,
  ClientRedirectUri,
  key: jwk64,
  algorithm: jwk.alg);

发送一个令牌

我们的PoP客户端会签名发出的HTTP请求

// configure signing details
var signature = new RS256Signature(p);
var signingOptions = new RequestSigningOptions();
var signingHandler = new HttpSigningMessageHandler(signature, signingOptions);

// set pop token
var client = new HttpClient(signingHandler);
client.SetToken("PoP", tokenResponse.AccessToken);

// call API
var apiResponse = await client.GetAsync(WebApiPipeline.Endpoint);

完整代码可以请看这里 here.
这里有另外一个例子here.

你可能感兴趣的:(请求PoP令牌)