授权流程访问和刷新令牌

时间:2019-05-09 14:15:03

标签: identityserver4

使用授权代码,拦截signin-oidc的中间件是否将访问令牌的授权代码交换了?还是必须以编程方式执行此操作?如果中间件做到了,那我能找到访问和刷新令牌吗?

还是我必须实现自己的重定向URL和代码并捕获返回的代码,并使用RequestAuthorizationCodeTokenAsync与访问令牌进行交换?

1 个答案:

答案 0 :(得分:0)

否,您不必实现部分即可获取由处理程序处理的令牌,但是您需要回调来处理登录,存储声明并创建登录。这是如何获取访问令牌的原始示例:

编辑

我将以Google为例,因为我手边有代码,但是IdentityServer OAuth应该相同,因为它们扩展了OAuthHandler。

services.AddAuthentication(options =>
{
   //Add your identity Server schema etc
})
.AddGoogle(options =>
{
    options.SaveTokens = true;
    options.ClientId = Configuration["Google:ClientId"];
    options.ClientSecret = Configuration["Google:ClientSecret"];
})

在身份验证控制器中:

[HttpPost("ExternalLogin")]
[AllowAnonymous]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
{
    var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { returnUrl });
    var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
    return Challenge(properties, provider);
}

[HttpGet("ExternalLoginCallback")]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string     remoteError = null)
{
    if (remoteError != null)
    {
        throw new Exception($"Error from external provider: {remoteError}");
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();
    if (info == null)
    {
        //It throws here, since there are no tokens 
        throw new Exception("Error: could not find user tokens");
    }

    //Handle the rest of authentication
}

会发生什么?您有一个按钮指向您的外部登录提供程序“ Google”作为提供程序。

您将重定向到Google登录页面,然后登录。

Google服务器使用授权码将您重定向回您的域和/ google-signin(默认隐藏在句柄中)

然后,Google处理程序将授权码与您的秘密一起使用以获取令牌

如果您指定保存令牌,则将在OAuth选项中保存响应中的令牌。以及从用户信息端点获得的一些基本声明。

然后,您将重定向到外部登录回调:

_signInManager.GetExternalLoginInfoAsync();

将获取保存的令牌。

所以回答您的问题。处理程序将负责保存令牌(如果您指定的话)。如果需要,您可以从signInManger中获取它们。