问题标签 [openid-connect]

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.

0 投票
4 回答
15646 浏览

mobile - 什么 OpenID Connect 授权流程来验证移动应用程序用户?

我正在构建一个与 RESTful API 交互的跨平台移动应用程序,并且我想使用 OpenID Connect 对我的用户进行身份验证。我将构建自己的 OpenID Connect 提供程序服务器。

OpenID.net声称

OpenID Connect 允许所有类型的客户端(包括基于浏览器的 JavaScript 和本机移动应用程序)启动登录流程并接收有关登录用户身份的可验证断言。

但是,我找不到任何解释如何实际验证移动应用程序客户端的文档。

这个 StackExchange 回答清楚地表明 OpenID Connect 不支持“基于资源所有者密码的授权”流程或“客户端凭据”流程。

只剩下“授权代码”流程(通常由服务器端应用程序使用)和“隐式授权”流程(通常由客户端应用程序使用)。这两者似乎都依赖于将用户重定向到提供者的授权端点,并让提供者重定向回客户端 URL。我不明白这如何适用于移动应用程序。

任何人都可以向我解释(或者更好,指向我的教程或一些示例代码)来解释如何做到这一点?

更新

澄清一下:OpenID Connect 依赖于客户端将用户重定向到授权端点,然后提供者将用户重定向回客户端。在客户端不是 Web 应用程序的情况下,这如何工作?

0 投票
3 回答
8372 浏览

python - Python 中的 OpenID Connect 提供程序

我一直在寻找如何在 python 中实现 OpenID Connect 提供程序,我发现了这个由 Roland Hedberg 制作的库( OpenID 推荐)。但是我已经阅读了文档示例,并且我认为对于没有太多知识的人来说,示例过于复杂(提供者、wsgi 和 cli 混合在一起)。

所以我的问题是:有谁知道更简单的示例或教程来实现这个库,还是我应该尝试在 OAuth2 库之上实现我的提供程序?

0 投票
1 回答
1099 浏览

google-app-engine - OpenId Connect 端点返回“未找到”

我正在将 OpenID 2.0 迁移到 OAuth 2.0 登录(请参阅https://developers.google.com/accounts/docs/OpenID?hl=ja)。我想将新的 OpenID 2.0 标识符映射到数据库中的旧的/现有的 OpenID Connect 标识符。

我正在处理 OAuth 响应 (redirect_uri),我想使用https://www.googleapis.com/oauth2/v3/token端点来交换访问令牌和 openid_id 的授权代码字段,我将使用它来选择我的数据库中的现有用户。

但是,我对https://www.googleapis.com/oauth2/v3/token的调用返回“未找到”。任何线索为什么?

我正在使用 scribe 1.3.7,这是我的代码:

0 投票
0 回答
262 浏览

google-openid - 初始登录后 OpenID Connect/JWT 中的正确流程是什么?

我正在研究如何使用 Google 的实现来实现 OpenID Connect,但我不清楚在初始收到 ID 令牌后如何处理与用户的基于令牌的请求身份验证。我的问题是 - 什么是“标准”做法?看来我至少有两个选择。

  1. 将 OIDC 提供者的 ID 令牌以标头或 cookie 的形式传递给客户端 JS,并让后续的 REST API 调用在 Bearer 标头中传递令牌(在服务器端对每个请求进行验证)。

  2. 生成一个新的 JWT 并遵循与 #1 中相同的协议。

当 JWT 到期时,最好的处理方式是什么?如果我的应用程序正在生成 JWT(选项 #2),是否是自动生成新的典型过程?如果使用 OIDC 提供程序的令牌作为身份验证令牌(选项 #1),是否通常使用 prompt=none 重复身份验证过程?

我也很好奇是否有替代方法可以在登录期间使用存储在服务器会话中的“状态”值。我想避免创建特定于服务器的会话。将 JWT 用于状态并在从客户端收到带有授权码的返回时对其进行验证是否安全?

我只对身份验证功能感兴趣,此时不需要 OAuth 提供的其他 API。

0 投票
1 回答
93 浏览

oauth-2.0 - 实施 SSO 解决方案

我希望用更适合现代需求的身份验证和授权解决方案来替换我们当前基于 openID 1 的 SSO 系统。

我想避免的一件事是让最终用户重定向到身份提供者以进行各种流程,例如登录、重置密码等。

是否有不依赖依赖方和身份提供者之间重定向的安全解决方案?

谢谢

0 投票
2 回答
1736 浏览

oauth-2.0 - 在 OpenID Connect 中跳过用户同意的方法

在身份验证请求中,如果用户先前同意某些客户端(针对特定范围列表),并且可能会多次提示他们进行相同的授权。¿ 可以跳过它吗?¿ 适用于代码和隐式流?¿ 多少时间记住同意?

我对实现这一点的方式有点困惑。Oauth2 草案说:

OpenID 草案说:

正在为 Django 开发 OpenID Provider 实现。 https://github.com/juanifioren/django-openid-provider

谢谢你的时间。问候。

0 投票
1 回答
2148 浏览

owin - 在 UseOpenIdConnectAuthentication 之后,如何将 Security Token 中的声明放入 OwinConext.User 中的 Controller.User(当前 HttpContext)中?

我有带有个人用户帐户的 VS2013 MVC5 项目。我修改Startup {Configuration(IAppBuilder app)}了这UseOpenIdConnectAuthentication是唯一允许的身份验证。

用户可以使用开箱即用的 MVC 项目模板管道在 AspNetIdentity DB 中注册。注册后,用户使用 OIDC 登录。

OpenID Connect STS(IdentityServer3 with AspNetIdentity)返回一个带有声明和角色的安全令牌。这些声明可ClaimsPrincipalRequest.GetOwinContext().Authentication.User.

Controller.User但是, (当前 HTTP 请求上下文)中缺少这些声明。

ClaimsPrincipal让两者匹配是一件好事吗?

问题:如果是这样,我该怎么做以及在哪里做?我不是专家,想知道OpenIdConnectAuthenticationNotifications.SecurityTokenValidatedor Application_PostAuthenticateRequest呢?

我意识到这是将 MVC5System.Web与 OpenIdConnect 的 OWIN 中间件混合的副作用,而不是默认的 MVC5 项目身份验证中间件。

0 投票
0 回答
1406 浏览

ruby - Ruby Openid 连接库和客户端消费示例

我正在寻找一个带有使用它的直接代码示例的 ruby​​ openid 连接客户端库。我在这里找到了一个库,它的示例基于 Rails,但我对 Rails 不太熟悉,而且我没有成功在其他地方找到一个 ruby​​ 客户端代码示例的清晰示例,希望有人可以帮助我解决这个问题。

谢谢。

0 投票
3 回答
1803 浏览

mediawiki - 这个授权交换有什么问题?

我已经使用PluggableAuthOpenID Connect扩展在 Azure 网站上设置了一个 MediaWiki 服务器。后者使用PHP OpenID Connect Basic Client库。我是 Azure AD 域的管理员,example.com我在其中创建了一个应用程序 ID URI、登录 URL 和回复 URL 都设置为https://wiki.azurewebsites.net/. 当我导航到 wiki 时,我观察到以下行为(暂时省略 cookie 值):

  1. 客户要求

    GET https://wiki.azurewebsites.net/ HTTP/1.1

  2. RP请求

    GET https://login.windows.net/example.com/.well-known/openid-configuration

  3. IP响应

    (一些回应)

  4. RP响应

    HTTP/1.1 302 Moved Temporarily Location: https://login.windows.net/{tenant_id}/oauth2/authorize?response_type=code&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&nonce={nonce}&state={state}

  5. 客户要求

    (跟随重定向)

  6. IP响应

    HTTP/1.1 302 Found Location: https://wiki.azurewebsites.net/?code={code}&state={state}&session_state={session_state}

  7. 客户要求

    (跟随重定向)

  8. RP请求(也重复 #2 和 #3)

    POST https://login.windows.net/{tenant_id}/oauth2/token grant_type=authorization_code&code={code}&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&client_secret={client_secret}

  9. IP响应

    (由 MediaWiki 解释;我此时没有记录完整的响应)

    AADSTS50001: Resource identifier is not provided.

请注意,如果我在步骤 8 中更改 OpenID PHP 客户端以提供“资源”参数,则会从 AAD 获得以下错误响应:

  1. RP请求

    POST https://login.windows.net/{tenant_id}/oauth2/token grant_type=authorization_code&code={code}&redirect_uri=https%3A%2F%2Fwiki.azurewebsites.net%2F&resource=https%3A%2F%2Fwiki.azurewebsites.net%2F&client_id={client_id}&client_secret={client_secret}

  2. IP响应

    AADSTS90027: The client '{client_id}' and resource 'https://wiki.azurewebsites.net/' identify the same application.

    (这个以前出现过。)

更新

根据@jricher 的建议,我已经取得了一些进展,但是在解决了更多错误之后,我遇到了一个我无法弄清楚的错误。完成这一切后,我将向受影响的库提交拉取请求。

这是我所做的:

  • 我已将第二个应用程序添加到example.comAzure AD 域,并将 App ID URI 设置为mediawiki://wiki.azurewebsites.net/,作为虚拟“资源”。我还授予https://wiki.azurewebsites.net/应用程序对这个新应用程序的委托访问权限。

  • 在步骤 #8中将resource虚拟应用程序的 URI 作为参数传递,我现在在 #9 中取回访问、刷新和 ID 令牌!

  • OpenID Connect 库要求对 ID 令牌进行签名,但当 Azure AD 对访问令牌进行签名时,它不会对 ID 令牌进行签名。它具有以下属性:{"typ":"JWT","alg":"none"}. 所以我不得不修改库以允许调用者指定未签名的 ID 令牌被视为“已验证”。嗯。

  • 好的,接下来事实证明无法验证声明,因为我指定的 OpenID 提供程序 URL 和令牌中返回的颁发者 URL 不同。(说真的?!)因此,必须将提供程序指定为https://sts.windows.net/{tenant_id}/,然后才能正常工作。

  • 接下来,我发现我还没有为 OpenID Connect 扩展运行 MediaWiki DB 升级脚本。谢天谢地,这是一个快速修复。

  • 在那之后,我现在(我希望是)尝试从 AAD 的 OpenID Connect UserInfo 端点获取用户信息的最后一个问题。我会给它自己的部分。

无法获取用户信息 [更新]

这就是我现在卡住的地方。在第 9 步之后,在一个或两个中间请求获取元数据和用于验证令牌的密钥之后,会发生以下情况:

  1. RP请求:

    (更新为使用带有Authorization: Bearer标头的 GET,根据MSDN规范。)

    GET https://login.windows.net/{tenant_id}/openid/userinfo Authorization: Bearer {access_token}

  2. 知识产权回应:

    400 Bad Request AADSTS50063: Credential parsing failed. AADSTS90010: JWT tokens cannot be used with the UserInfo endpoint.

    (如果我将 #1​​0 更改access_token为正文中的 POST 请求或查询字符串中的 GET 请求access_token,AAD 将返回错误:如果AADSTS70000: Authentication failed. UserInfo token is not valid.我使用已收到。)id_tokenaccess_token

帮助?

更新

我仍然希望有人能阐明最后一个问题(UserInfo 端点不接受承载令牌),但我可能会将其拆分为一个单独的问题。同时,我正在向库中添加一些解决方法(即将发布的 PR),以便可以使用已经在不记名令牌中返回的声明,而不是调用 UserInfo 端点。非常感谢所有为此提供帮助的人。

我还有一个唠叨的部分想知道如果使用 OpenID Connect 基本配置文件,整个事情是否会变得更简单。我认为 MediaWiki 扩展没有实现它是有原因的。

更新 2

我刚刚看到Vittorio Bertocci 的一篇新帖子,其中包含了这个有用的提示:

...在此请求中,应用程序正在为自己请求令牌!在 Azure AD 中,仅当请求的令牌是 id_token 时才有可能...

这表明只需将步骤 8 中的令牌请求类型从authorization_code更改为id_token即可消除对非标准resource参数的需求,并且也使丑陋的第二个 AAD 应用程序变得不必要。仍然是一个黑客,但感觉不像一个黑客。

0 投票
3 回答
2069 浏览

openid - OpenID、OpenID2、Open Connect 的未来是什么?是否值得实施提供者?

我看到 OpenID 登录随处可见,并决定我应该考虑在我的服务器上实现我自己的提供程序,这样我就可以控制我的信息和登录。

令人惊讶的是,这是相当复杂和困难的。

尽管许多站点允许 OpenID 登录(例如这个),但我发现了以下问题:

  1. 许多简单的“自己动手”的单一身份 OpenID 提供者解决方案现在都是蒸汽软件。
  2. OpenID 存在相当严重的持续安全问题:

http://en.wikipedia.org/wiki/OpenID#Security

  1. 许多 OpenID 提供者似乎已经消失(MyOpenID.com、getopenid.com 等)
  2. 该协议似乎随着先前版本的下降而不断变化(可能是由于安全问题?)

例如,2013 年 8 月关于使用 Google Plus/Profiles 作为代表的 SO 解决方案现在收到来自 Google 的错误,称今年 4 月 Google 将删除 OpenID 2.0 支持并替换为 OpenID Connect:

将 OpenID 委托给 Google(不是 Google Apps)

有没有人提供一个简单的 OpenID Connect单一身份提供者?查看 OpenID 的 OpenID 提供商软件列表,根本没有提到任何 OpenID Connect 解决方案,更不用说页面已经 4 年没有更新了!

http://wiki.openid.net/w/page/12995226/Run%20your%20own%20identity%20server

浏览所有这些信息,我真的很高兴几年前我搁置了在我的服务器上实施 OpenID 2.0 的计划,因为它看起来已经过时了,我想不出一个简单的方法来证明我的身份。令人惊讶的是,我不能只安装一个软件包并编辑一个配置文件就可以了。大多数更简单的实现都涉及安装和使用 PHP,它有自己的安全问题需要了解。

所以 - 任何是 OpenID 专家及其发展方向的人,谁能给我一些关于如何设置我的身份提供者的建议,或者是否值得困难?我很想控制我的信息和我的电子邮件地址的分发以及拥有一个永久的身份,但如果标准会不断变化,那么它并不是真正的永久。