当用户通过Google登录IdentityServer4时,我想访问该电子邮件(可能是他们的google-id),但没有客户端请求它。所以它应该每次都可以访问,所以我可以把它放在access_token中(因为我们的API需要用户的电子邮件地址)。
我已注入IProfileService
,IClaimsService
,但我无法在那里找到该电子邮件。是否可以挂钩到Google-SignIn Callback,以便我可以手动访问响应?
谢谢!
答案 0 :(得分:0)
我通过在AccountController.ExternalLoginCallback
中添加我需要的声明来解决这个问题:
//Add E-Mail claim even if client didn't ask for it
if (claims.Exists(c => c.Type.Equals(ClaimTypes.Email))) {
additionalClaims.Add(new Claim(JwtClaimTypes.Email, claims.FirstOrDefault(x => x.Type.Equals(ClaimTypes.Email)).Value));
}
然后我通过依赖注入我的access_token
类并在ProfileService
中添加声明,将MyProfileService.GetProfileDataAsync
声明添加到public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var claims = new List<Claim>();
Claim emailClaim = context.Subject.Claims.Where<Claim>(claim => claim.Type.Equals(JwtClaimTypes.Email)).FirstOrDefault();
if (emailClaim != null)
{
claims.Add(emailClaim);
}
context.IssuedClaims = claims;
return Task.FromResult(0);
}
:
Foo.execSomething(k,v).then(function(){/*do nothing*/},(err) => {
console.log(err)
}).catch((err) => {
console.log(err)
});