从 Google OpenID 迁移到新的 OAuth 2

2023-12-05

我发现已经有一些关于此的问题,但我发现没有一个涉及任何细节。

我之前使用过来自 DotNetOpenAuth 的自己的代码,但现在我决定切换到 Microsoft Wrapper 进行身份验证。无论如何,我发现这个非常好的 OAuth 客户端:

https://github.com/mj1856/DotNetOpenAuth.GoogleOAuth2

看起来工作正常,但现在到了迁移部分。在我当前的登录系统中,我保存了 Google 返回的完整 OpenID URL,其形式为:

https://www.google.com/accounts/o8/id?id=????????????????????????????????????

根据这里的文档https://developers.google.com/accounts/docs/OpenID我应该能够通过新的 OAuth 系统以某种方式获取该值。

我已在身份验证请求中包含“openid.realm”参数。

    return BuildUri(AuthorizationEndpoint, new NameValueCollection
        {
            { "response_type", "code" },
            { "client_id", _clientId },
            { "scope", string.Join(" ", scopes) },
            { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) },
            { "state", state },
            { "openid.realm", "http://myoldopenidrealm" }
        });

据我了解,这应该是我需要做的所有文档。我已确保用于 OpenID 2 身份验证的领域相同,并且与我的返回 URL 相同。

完成此操作后,我执行该令牌请求,据我了解,我应该在这里看到一个“open_id”字段,但我无法理解如何获取它。

protected override string QueryAccessToken(Uri returnUrl, string authorizationCode) {
    var postData = HttpUtility.ParseQueryString(string.Empty);
    postData.Add(new NameValueCollection
        {
            { "grant_type", "authorization_code" },
            { "code", authorizationCode },
            { "client_id", _clientId },
            { "client_secret", _clientSecret },
            { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) },
        });

    var webRequest = (HttpWebRequest)WebRequest.Create(TokenEndpoint);

    webRequest.Method = "POST";
    webRequest.ContentType = "application/x-www-form-urlencoded";

    using (var s = webRequest.GetRequestStream())
    using (var sw = new StreamWriter(s))
        sw.Write(postData.ToString());

    using (var webResponse = webRequest.GetResponse()) {
        var responseStream = webResponse.GetResponseStream();
        if (responseStream == null)
            return null;

        using (var reader = new StreamReader(responseStream)) {
            var response = reader.ReadToEnd();
            var json = JObject.Parse(response);
            var accessToken = json.Value<string>("access_token");
            return accessToken;
        }
    }
}

这就是文档所说的,我看不到“sub”或“openid_id”字段。

*该令牌请求的响应包括常用字段(access_token 等),以及 openid_id 字段和标准 OpenID Connect 子字段。在此上下文中您需要的字段是 openid_id 和 sub:*


sub 和 openid_id 字段包含在 OpenID Connect 中ID token,而不是访问令牌。

您可以通过令牌端点(与用于检索访问令牌的端点相同)获取 ID 令牌,也可以直接从 OpenID Connect 身份验证请求中检索它(通过将 id_token 添加到 response_type 参数,可能会节省后台时间)结束对令牌端点的调用)。

希望有帮助!

--

如何获取 ID 令牌的示例

(使用 oauthplayground 生成的流——强烈推荐用于调试 OAuth2/OpenID Connect 流的工具)

  1. Go to https://developers.google.com/oauthplayground
  2. 选择(例如)Oauth2 API v2 userinfo.email 范围
  3. 单击授权 API
  4. 批准 OAuth2 请求
  5. 按“兑换令牌授权码”按钮。

您可以查看所有 http 请求/响应。有趣的是,对 Google 令牌 API 调用的响应包含

{ "access_token": "ya29.XYZ", "token_type": "承载者", “过期时间”:3600, "refresh_token": "1/KgXYZ", "id_token": "我的.id.token" }

您可以对获取的 ID 令牌(在本例中为“id”)的有效负载进行 Base 64 解码,并获取所有相关的用户信息。要手动进行 Base 64 解码,您可以使用任何在线工具(请参阅https://www.base64decode.org/例如)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Google OpenID 迁移到新的 OAuth 2 的相关文章

  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • 当 'type = "norm" 时如何计算 ggplot stat_ellipse() 的面积?

    类似这个问题 当 type norm 时 有什么方法可以计算这个椭圆的面积吗 默认为type t type norm 显示不同的椭圆 因为它假设多元正态分布而不是多元 t 分布 这是代码和情节 使用与其他帖子类似的代码 library gg
  • 页面加载后jquery加载div

    实际上我正在寻找的加载是首先加载页面 然后加载包含大量数据的 div 所以 我想首先加载主页 然后使用 jQuery 函数加载正文 div 内容 但有一些延迟 实现这个的简单方法是什么 div div navigation div div
  • 如何使用 Lombok 访问 getter 和 setter 方法? [复制]

    这个问题在这里已经有答案了 我已经在我的项目中添加了 Lombok maven 存储库 并成功使用了 Lombok 注释 我尝试从另一个类访问 setter 和 getter 方法 但无法访问这些方法 我正在使用 spring Boot 版
  • SQL Server - 有没有办法批量解决排序规则冲突

    我们遇到的情况是 开发和生产 SQL Server 之间的数据库 表和某些列的排序规则不同 这对开发造成了严重破坏 事情会在开发上工作 然后由于升级时的排序规则冲突而中断 数据和结构将从产品复制到开发 这又会因为冲突等而破坏开发上的查询 我
  • 执行Python程序

    我已经在网上搜索答案很长一段时间了 但这让我非常头疼 我使用的是 Ubuntu 12 04 我想从终端执行 Python 脚本而不使用完整路径 因此 我通过将以下内容添加到 bashrc 中 将 home kyril python scri
  • 嵌入式 Jetty 找不到带注释的 Servlet

    短的 我有一个提供 war 工件的项目 其中包含带有注释的 servlet 但没有 web xml 如果我尝试在 jetty 中使用 war 我总是只能得到 war 内容的目录列表 而不是 servlet 执行 任何想法 很长的故事 我的
  • SQL 按最近日期选择具有两个唯一列的行

    使用以下查询和结果 我正在查找 ChargeId 和 ChargeType 唯一的最新条目 select chargeId chargeType serviceMonth from invoice CHARGEID CHARGETYPE S
  • Hindley-Milner 的哪一部分是你不明白的?

    I swear曾经有一个T shirt出售带有不朽文字的 哪一部分 do you not理解 就我而言 答案是 全部 特别是 我经常在 Haskell 论文中看到这样的符号 但我不知道它的含义 我不知道它应该是数学的哪个分支 我当然认识希腊
  • 在Interceptor.intercept()内部,我如何知道Action是否已经被执行?

    我正在使用拦截器在基于 Struts 的应用程序中实现一些内容 但我对它们的生命周期如何工作感到困惑 根据 Struts 文档 拦截者 编写拦截器 and 大图景 它应该像这样工作 FirstInterceptor NextIntercep
  • Boost::解析字符串时的精神斗争

    我正在尝试用 Boost Spirit 解析字符串 但我无法让它工作 从今天起我就没有使用 Boost Spirit 的经验了 该字符串由用 分隔的命令组成 命令是 INC 一些整数 BOMB 第一个整数 第二个整数 MOVE 第一个整数
  • Typescript:重写超类方法而不需要知道超类方法签名

    以下是我如何可靠地重写 vanilla JS 中的方法 而不关心名称或参数数量或返回值 import EventEmitter from events console log event arguments every time this
  • 结合使用 Bootstrap for Angular 和 Material design for Angular

    我正在做一个与此相关的项目template 该模板是使用 AngularJs 和 Bootstrap UI 角度引导 编写的 我想包含一些材料设计元素 例如卡片等 可以这样做吗 推荐吗 我的事情是 我们已经喜欢这个模板及其许多元素的方式 但
  • 单引号和双引号一起作为 HTML 属性值?

    我们有这样的代码 echo
  • 输出 JSON 对象中的所有直接邻居

    是否可以在 Cypher 中编写查询以将以下查询的输出格式化为 JSON 对象 MATCH n Artist name Metallica r gt m Album RETURN node n neighbours type r colle
  • 检索 ListView asp.net 中选定单选按钮的值

    我想发送一个 Guid 当用户单击结账时 该 Guid 应作为 eventargs 与每个单选按钮关联 我只用 RadioButtonList 就可以实现此功能 但我不能在这里使用它 因为其余字段是从数据库中提取的 有很多涉及此类主题的问题
  • JavaScript - 在内部函数中引用“this”

    考虑以下代码 MyClass prototype my func function this x 10 ajax success function data alert this x 它不起作用 因为显然this没有绑定到闭包的执行上下文中
  • ORDER BY RAND() 似乎不是随机的

    我有一个相当简单的 SQL MySQL SELECT foo FROM bar ORDER BY rank RAND 我注意到 当我刷新结果时 随机性很弱 目前的样本数据中有六个具有相同排名的结果 整数零 有很多随机性测试 但这里有一个简单
  • 无法从节点模块自动导入反应组件

    我最近开始使用 VS Code 我正在使用带有 React 和 Type 脚本的 Material ui 但我无法使用 alt option Enter 快捷方式导入 Material ui 的组件 我使用的是mac 我使用的typescr
  • Plotly:在箱线图中用样本名称注释异常值

    我正在尝试使用 ggplot 创建箱线图并使用数据集绘制箱线图airquality where Month在 x 轴上并且Ozone值位于 y 轴上 我的目标是注释该图 以便当我将鼠标悬停在离群点上时 它应该显示Sample除臭氧值外的名称
  • 从 Google OpenID 迁移到新的 OAuth 2

    我发现已经有一些关于此的问题 但我发现没有一个涉及任何细节 我之前使用过来自 DotNetOpenAuth 的自己的代码 但现在我决定切换到 Microsoft Wrapper 进行身份验证 无论如何 我发现这个非常好的 OAuth 客户端