我有一个 API 服务器(资源服务器)和多个应用程序、Web GUI (SPA) 和一个桌面客户端,也许还有更多。除了我的 API 服务器的 http 基本身份验证之外,我还想使用 openid-connect。使用哪个 openid 提供程序应该是可配置的。我自己的,facebook,google……我只想做身份验证,我不需要他们的 API。我只需要一些个人资料数据,例如电子邮件或名字。
假设我已将 google 配置为我的 IdP,并且我目前正在使用我的 Web GUI (SPA)。我需要登录,没问题,根据https://developers.google.com/identity/protocols/OpenIDConnect我将用户重定向到谷歌,获取我的授权码,Web Gui (SPA) 从谷歌获取 id_token 和 access_token .
到目前为止没问题,但现在 SPA 必须与我的 API 服务器一起工作,并且 API 服务器需要验证来自客户端 (WebGui SPA) 的每个请求(因为它是一个无状态的休息 api)并且需要知道哪个用户实际上做了这个。
一种
那么来自 google 的 access_token 是用来访问 google api 的吗?但我也可以将这个 access_token 与每个请求一起传递给我的 api 服务器,api 服务器调用https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=xxx来验证 access_token 并获取帐户名(邮件)。但这听起来不对,是吗?
乙
我也有 id_token 可以验证,而无需每次都调用谷歌服务器。那么我是否也可以将 id_token 作为承载传递给我的 api 服务器,而 api 服务器可以验证 id_token?但是根据 openid-connect 规范, access_token 实际上是刚刚传递给 api 服务器的那个,而 id_token 必须保留在客户端上。但是 id_token 对我来说完全没用,API …
api oauth-2.0 single-page-application openid-connect google-openidconnect
我写了一些代码来使用Google SignIn构建Web应用程序.
首先,初始化API平台,
gAuth = gapi.auth2.init( {
client_id: gAuthClientId,
fetch_basic_profile: false,
scope: gAuthScope
} );
Run Code Online (Sandbox Code Playgroud)
并让用户登录.
gAuth.signIn({
prompt: 'none'
});
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我想跳过(已经)登录用户的auth弹出窗口,并按照开发人员文档中的引用进行操作:
prompt:指定是否提示用户重新进行身份验证.请参阅OpenID连接请求参数.可选的.
提示
可选.以空格分隔的区分大小写的ASCII字符串值列表,指定授权服务器是否提示最终用户进行重新认证和同意.定义的值为:
none
授权服务器不得显示任何身份验证或同意用户界面页面.如果最终用户尚未经过身份验证,或者客户端没有对所请求的声明进行预先配置的同意,或者不满足处理请求的其他条件,则会返回错误.错误代码通常是login_required,interaction_required.这可以用作检查现有身份验证和/或同意的方法.
但它效果不好.实际上,对于已登录的用户,API会显示一次空弹出窗口,并立即关闭它.当我自动执行此阶段时,它被阻止浏览器.
为什么会这样?我应该做些什么来避免签名用户弹出窗口?
我正在尝试在我的应用程序中添加 Google 和 Azure Active Directory 权限作为 OpenIdConnect 选项。
如果我分别添加它们中的每一个,它就可以正常工作。但是,如果我将它们都添加,则会收到以下错误消息:
无法取消对消息的保护。状态
这些是 OpenIdConnectOptions 配置:
//Google
appBuilder.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
ClientId = ".....apps.googleusercontent.com",
Authority = $"https://accounts.google.com",
ClientSecret = "xxxyyyzzzz",
AuthenticationScheme = "Google",
DisplayName = "Google",
AutomaticChallenge = true
});
//Azure AD Providers
var schemeName = "Azure Active Directory";
var clientId = "1234567890";
var tenantId = "0987654321";
appBuilder.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
ClientId = clientId,
ClientSecret = "aaaaabbbbcccc",
Authority = $"https://login.microsoftonline.com/{tenantId}",
AuthenticationScheme = "Azure Active Directory",
DisplayName = "Azure Active Directory",
AutomaticChallenge = true,
});
Run Code Online (Sandbox Code Playgroud) azure openid-connect .net-core identityserver4 google-openidconnect