问题标签 [oidc-client-js]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - oidc-client-js 未从 Identity Server 4 正确获取声明
我有一个 Identity Server 4 的本地实例,我正在尝试按照本指南创建一个 Javascript 客户端。这使用了oidc-client-js库,并且我使用了登录弹出方法,因此我的登录事件处理程序如下所示:
身份验证似乎工作正常 - 我被重定向到接受客户端请求、验证我的登录并将我返回到客户端应用程序的身份服务器。但是,文档说user.profile
上面代码中的对象应该包含用户声明,但它没有。这是use.profile
我回来的:
该sub
属性是刚刚通过身份验证的用户的正确 ID。但是我的身份服务器也发出声明以响应我的客户请求的其他范围(profile
和email
),所以我应该看到诸如name
,preferred_username
等声明email
。IProfileService
在 IS4 中调试我的实现时,我可以观察到这些声明被发出。此外,如果我使用access_token
返回的用户对象向另一个在本地运行的 API(ASP.NET Web API)发出请求,我确实会在以下位置看到这些声明this.User.Claims
:
那么如何在我的 Javascript 代码中获取这些声明呢?
reactjs - 为什么在使用 Redix OIDC 时 Firefox 会自动注销我的用户?
我正在构建一个 React 应用程序,我想在其中使用 OpenID Connect 对用户进行身份验证。在我的开发环境中,OIDC 授权是 Identity Server 4 的本地运行实例。
我找到了一个将oidc-client-js库与 Redux 集成的Github存储库,因此我下载了示例存储库并将其指向我的身份服务器。我所做的唯一其他更改是使用我的不记名令牌而不是示例使用的 YouTube 调用本地 API。
我有一个 Windows 环境。
在 Chrome 和 Edge 上,该示例完美运行。我能够使用不记名令牌进行身份验证并成功调用我的本地 API。然而,在 Firefox 上,虽然身份验证工作正常并且我的 API 被成功调用并显示结果,但几秒钟后,应用程序突然出现让用户退出。(我说“出现”是因为它的行为就像用户已注销,但如果我重新加载页面,则用户已经通过身份验证)。
注意:我在这里划掉了一个部分。这是一条红鲱鱼。请参阅下面的更新 1,其中描述了 Firefox 如何添加第二个 iframe。没有为我的客户端注册重定向 URL,导致重定向到导致这些 CSP 警告的 IS4 错误页面。
查看控制台日志,Chrome 和 Firefox 之间的主要区别是我在 Firefox 中看到的警告:
内容安全策略:由于“frame-ancestors”指令而忽略“x-frame-options”。
这会在验证用户身份后一两秒出现在控制台中。我怀疑这可能与 Javascript OIDC 客户端为检查会话而添加的 iframe 有关。此 iframe 指向身份授权上的 /connect/checksession。
如果我在 Firefox 中导航到此检查会话 URL,我会在控制台中收到 Javascript 错误:
内容安全策略:页面的设置阻止了自身资源的加载(“script-src”)。
我在 Chrome 中没有看到此错误。
这个Content-Security-Policy
页面是default-src 'none'; script-src 'sha256-VDXN0nOpFPQ102CIVz+eimHA5e+wTeoUUQj5ZYbtn8w='
我可以提供的唯一其他信息是在 Firefox 中编写的控制台日志似乎将用户注销:
我希望有人能够使用这些信息为我指明正确的方向,因为我真的不确定这里的问题是什么。似乎问题出在身份服务器中,因为它在检查会话时报告 Firefox 中的 Javascript 错误,但我不确定我能做些什么。
更新 1
经过深入研究,我发现当第二个 iframe 被添加到页面调用身份机构的连接/授权端点时,会出现问题,其 URL 如下:http: //identity.domain.com/connect/authorize ?client_id=js&redirect_uri =http%3A%2F%2Flocalhost%3A8080%2Fsilent_renew.html&response_type=id_token&scope=openid&state=9d87c43c58c84fddbde5fd9aa0f97df7&nonce=826fb8d6dc114549810584ddd01a3271&prompt=none。这只发生在 Firefox 上。在 Chrome 和 Edge 中,第二个 iframe 永远不会被添加。查看身份服务器日志,我看到在响应此连接/授权调用期间记录了以下行(以及其他行) :
授权请求中没有用户
显示错误:提示=无已请求但用户未通过身份验证”。
但我仍然没有更接近理解为什么会发生这种情况。
javascript - AngualrJS OIDC 客户端静默更新页面
我正在努力理解这个无声的更新过程是如何工作的。根据我阅读的内容,我了解到 html 页面将保存在 iframe 中,并且它会不断 ping 服务器以更新令牌。
我有一个角度应用程序,通常我们将所有内容打包到一个简单的 index.html 文件中,其余部分将根据路由(ui-router,模板缓存)插入。
所以在我的上下文中,我们应该把这个 html 打包吗?或者它应该是单独的 html 页面与 index.html 一起存在吗?
token - 如何在 oidc-client 中确定身份令牌过期
我在服务上使用 Identity Server 3,在前端使用 oidc-client.js。Identity Server 中的客户端设置未设置令牌生命周期选项,因此身份令牌生命周期的默认值应为 300 秒(5 分钟),访问令牌生命周期的默认值应为 3600 秒(60 分钟或 1 小时)。我的客户端应用程序请求并接收身份令牌和访问令牌。oidc-client 用户对象公开有关访问令牌的过期信息。但是我怎么知道身份令牌何时过期?或者更重要的是,哪个令牌应该代表仍然有效的登录/身份验证?我的代码目前正在使用用户对象过期数据来确定用户是否经过身份验证,但现在我意识到这是访问令牌过期,我不确定这是正确的做法。同样的问题问了另一种方式:
vuejs2 - Vue js 与身份服务器 4 的集成
我正在客户端实施identity server 4
。vue js
目前,我在应用程序中只有管理员登录名,密码和用户名。
我没有任何将用户重定向到登录的公共站点。我希望用户在点击应用程序客户端 URL 时直接重定向到登录页面。
目前在示例版本中identity server 4
,用户需要点击导航栏上的登录按钮并重定向到登录。
我想通过以下方式做:
- 客户端点击 URL。检查用户是否通过身份验证。
- 重定向到身份服务器。
- 使用用户名/密码登录
- 成功登录后重定向到客户端门户。
我很难将这种方法集成到vue js
.
在我当前的实现中,应用程序总是在循环中运行,并且总是被重定向到登录。
store.getters.isAuthenticated
永远不会是真的,它总是用 SignIn 重定向应用程序。
我无法弄清楚我是否遗漏了我router.beforeEach
的某些内容或oidc
.
路线:
登录组件:
配置.js
登录:this.userManager.signinRedirect()
完成登录:this.userManager.signinRedirectCallback()
静音.html:
angular - Angular - oidc-client 为每个 REST API 调用发送一个 /authorize 请求
我目前正在设置一个带有SPA 客户端和一些 REST 服务的身份服务器来使用数据。
一切似乎都正常,但我目前很难理解,为什么每个有效的 API 调用都会access_token
触发/authorize
对身份服务器端点的请求。
登录页面上的按钮
这个按钮只是通过HttpClient
from的一个实例调用我的 REST API@angular/common/http
这些按钮在我的/login
页面上。
来自身份服务器的回调设置为转到/login/callback
。
/authorize
对端点的请求
每次单击该按钮都会向/authorize
端点发送一个请求,结果会将我通过 http 重定向302
到该/login/callback
页面。
请求仍然通过,一切正常,但总是发生这种重定向。
我本来希望在有效的情况下,access_token
不需要这个请求?
AccessToken 拦截器
在AccessTokenInterceptor
I do call myOidcService
中,可以UserManager
从oidc-client库访问。
由于某种原因,涉及到getUser()
的每个请求都会UserManager
触发该/authorize
请求作为响应——即使access_token
它仍然有效。我在这里想念什么?
感谢您在这方面的任何帮助,如果您需要更多代码示例,请告诉我。
更新 1
一旦我调用“Call Api”按钮,就会发出以下三个请求。
OPTIONS
请求我的 REST API。/authorize
请求(最终返回一个http302
并执行我想避免的重定向)GET
请求这是我打算做的。
更新 2
Web 应用程序 - UserManagerSettings
身份服务器 - 客户端配置
更新 3
reactjs - 反应中的onelogin OIDC令牌刷新
我一直在尝试使用该oidc-client
库实现令牌刷新,但收效甚微。非常感谢任何帮助或见解。
堆:
- 反应
- GraphQL(阿波罗客户端)
结构:
我尝试了几种方法,首先是在我的文件夹中automaticSilentRenew
创建一个static-renew.html
回调文件public/
- 但这两种方法都给了我一个No state in response
错误,所以我开始着手解决方法。
解决方法:
我将路由器包装在一个组件中,该组件执行以下操作:
在 mount 它调用
oidc-client.getUser()
然后添加以下侦听器:oidcMgr.events.addAccessTokenExpiring(handleTokenExpiring)
window.addEventListener('message', this.handleSilentRenew)
当
addAccessTokenExpiring
事件第一次触发时,它会调用一个函数:oidcMgr.createSigninRequest({ redirect_uri: process.env.REACT_APP_SILENT_REDIRECT_URI })
并使用以下方法将响应设置为本地状态apollo-link-state
当 apollo-link-state 中存在 tokenURI 时渲染 iFrame(来自上面的函数)。
当组件卸载时,它会删除两个侦听器。
- 当回调 URL 被命中时,它会挂载一个向源发布消息的组件,
silent-renew
以便在步骤 1 中安装的侦听器可以将令牌 URI 设置为''
inapollo-link-state
从而终止 iframe 并getUser
再次调用。
这适用于刷新令牌,但似乎 iFrame 正在将整个应用程序加载到其中,然后终止,导致应用程序消耗了不必要的资源。
有没有另一种更直接的方法来使用这个库来刷新 React 应用程序中的令牌?任何帮助或观点将不胜感激。谢谢!
identityserver4 - signinSilentCallback 中没有用户使用身份服务器和 javascript 的 oidc 客户端
我在以下代码中得到用户未定义。
我已经从 MVC 验证了用户。
但是当我使用 signinSilentCallback 来获取该用户的详细信息时,在 js 中使用 oidc-client 会变得未定义。
它也没有给出任何错误。
在 Identityserver 4 中,客户端定义如下。
angular - 当我从 angular2 应用程序注销时,Angular2 oidc-client 未清除 mvc 应用程序的 cookie
我有一个授权服务器,目前我的 angular2 应用程序和 mvc webapp 都在使用它。
我已经使用 oidc-client javascript 包在 angular2 应用程序中实现了授权。除注销功能外,一切正常。
这是我用来注销我的 angular2 应用程序的代码,该应用程序使用 oidc-client 来实现授权。
但这并没有注销我的其他 asp.net web mvc 应用程序。
但反过来工作正常,即如果我注销我的 mvc Web 应用程序,我的 Angular 应用程序将重定向到授权服务器以登录。
任何人都可以帮助解决这个问题,以便如果我退出我的 angular2 应用程序,我应该能够使用 mvc 应用程序而无需再次登录。
提前致谢。
angular - 如何在 events.addUserLoaded Angular 6 中重定向
我正在使用 oidc-client 库。登录后,在回调中我调用 signinRedirectCallback(),但用户没有立即加载,并且在加载之前我无法重定向到受保护的页面。我试图添加 router.navigateByUrl('/protected'); 在 events.addUserLoaded 但运行时,它返回错误:TypeError:无法读取未定义的属性“navigateByUrl”。