刷新访问令牌时调用自定义 REST API
Call Custom REST API When Refreshing Access Token
我有一个自定义登录策略,它调用自定义 REST API 从我的数据库中获取有关用户的一些信息。
该信息需要每隔一段时间更新一次,但我可以负担得起每小时更新一次。
问题是,我们不会每小时提示用户登录。相反,我们每小时使用 acquireTokenSilent
静默刷新令牌
我需要以某种方式拦截 acquireTokenSilent
,使其调用我的自定义 REST API 并提取额外的声明,就像我在自定义登录策略中所做的那样。
有办法吗?
查看@Chris Padgett 的回答
您可以通过一种方式实现,
- 设置一个计时器来进行网络 API 调用(我猜你已经有一个可以提出静默续订请求)
- 通过发送用户访问令牌从 JS 进行 [授权] 休息 API 调用
- 进行数据库调用以从 rest API 中提取详细信息并将它们保存在您的 SPA 应用局部变量中。
The Configure the resource owner password credentials flow in Azure Active Directory B2C using a custom policy article 介绍了如何为令牌刷新实施用户旅程。
具体来说:
- 此用户旅程引用自 JwtIssuer 技术配置文件的 RefreshTokenUserJourneyId 元属性。
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="JwtIssuer">
<Metadata>
<!-- Point to the redeem refresh token user journey-->
<Item Key="RefreshTokenUserJourneyId">ResourceOwnerPasswordCredentials-RedeemRefreshToken</Item>
</Metadata>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
- ResourceOwnerPasswordCredentials-RedeemRefreshToken用户旅程检查刷新令牌是否已经失效
<UserJourney Id="ResourceOwnerPasswordCredentials-RedeemRefreshToken">
<PreserveOriginalAssertion>false</PreserveOriginalAssertion>
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="RefreshTokenSetupExchange" TechnicalProfileReferenceId="SM-RefreshTokenReadAndSetup" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="CheckRefreshTokenDateFromAadExchange" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId-CheckRefreshTokenDate" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
您可以将您的 API 呼叫添加到此用户旅程。
我有一个自定义登录策略,它调用自定义 REST API 从我的数据库中获取有关用户的一些信息。
该信息需要每隔一段时间更新一次,但我可以负担得起每小时更新一次。
问题是,我们不会每小时提示用户登录。相反,我们每小时使用 acquireTokenSilent
我需要以某种方式拦截 acquireTokenSilent
,使其调用我的自定义 REST API 并提取额外的声明,就像我在自定义登录策略中所做的那样。
有办法吗?
查看@Chris Padgett 的回答
您可以通过一种方式实现,
- 设置一个计时器来进行网络 API 调用(我猜你已经有一个可以提出静默续订请求)
- 通过发送用户访问令牌从 JS 进行 [授权] 休息 API 调用
- 进行数据库调用以从 rest API 中提取详细信息并将它们保存在您的 SPA 应用局部变量中。
The Configure the resource owner password credentials flow in Azure Active Directory B2C using a custom policy article 介绍了如何为令牌刷新实施用户旅程。
具体来说:
- 此用户旅程引用自 JwtIssuer 技术配置文件的 RefreshTokenUserJourneyId 元属性。
<ClaimsProvider>
<DisplayName>Token Issuer</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="JwtIssuer">
<Metadata>
<!-- Point to the redeem refresh token user journey-->
<Item Key="RefreshTokenUserJourneyId">ResourceOwnerPasswordCredentials-RedeemRefreshToken</Item>
</Metadata>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
- ResourceOwnerPasswordCredentials-RedeemRefreshToken用户旅程检查刷新令牌是否已经失效
<UserJourney Id="ResourceOwnerPasswordCredentials-RedeemRefreshToken">
<PreserveOriginalAssertion>false</PreserveOriginalAssertion>
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="RefreshTokenSetupExchange" TechnicalProfileReferenceId="SM-RefreshTokenReadAndSetup" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="CheckRefreshTokenDateFromAadExchange" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId-CheckRefreshTokenDate" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
您可以将您的 API 呼叫添加到此用户旅程。