使用 OAuth2 对应用程序*和*网站进行身份验证

2024-05-07

我正在开发一个主要通过应用程序访问的网站,我想使用 OAuth2 进行用户注册和身份验证。由于它是一个 Android 应用程序,我将开始使用 Google 的 OAuth2 东西,因为它在 Android 上提供了一个不错的 UI。

谷歌表示“您可以选择使用 Google 的身份验证系统来外包应用程序的用户身份验证。这可以消除创建、维护和保护用户名和密码存储的需要。” https://developers.google.com/accounts/docs/OAuth2Login这就是我想做的。However当我浏览他们所有的例子和诸如此类的东西时,我只能找到关于拥有一个网站的东西or应用程序根据 Google 的服务对用户进行身份验证。

事实上,当我用 Google 的 OAuth2 注册我的应用程序(“客户端”)时,可以选择网站客户端和“已安装”客户端(即移动应用程序),但不能同时选择两者。我可以创建两个单独的客户端,但我阅读了 OAuth2 草案,我认为会有一个问题,我现在将对此进行解释。

这是我设想的它的工作方式:

  1. 用户要求 MyApp 访问他的私人数据。
  2. 应用程序使用AndroidAccountManager类来请求 Google API 的访问令牌。
  3. Android 对用户说“应用程序‘MyApp’想要访问您在 Google 上的基本信息。可以吗?”
  4. 用户说是的。
  5. AccountManager使用手机上存储的凭据连接到 Google 的 OAuth2 服务器,并请求访问令牌。
  6. 返回访问令牌(位于绿线后面)。
  7. AccountManager将访问令牌返回给 MyApp。
  8. MyApp 向 MySite 发送请求以获取用户的私有数据,包括访问令牌。
  9. MySite 需要使用访问令牌验证用户。它验证令牌如此处所述 https://developers.google.com/accounts/docs/OAuth2Login#validatingtoken,与 Google - “Google,此令牌有效吗?”。
  10. 现在,我什么want发生的情况是 Google 说“是的,无论是谁给你的,确实是那个用户。”,但我认为实际会发生的情况(基于 OAuth2 草案和 Google 的文档)是它会说“不可能!那个令牌是仅对 MyApp 有效,而您就是 MySite。GTFO!”。

那么我应该怎么做呢?并且请不要说“使用 OpenID”或“不要使用 OAuth2”或其他类似的无用答案。哦,我真的很想继续使用这个好东西AccountManagerUI 而不是蹩脚的弹出窗口WebViews

Edit

Nikolay 的临时答案(我会报告它是否有效!)是它实际上应该有效,并且 Google 的服务器不会关心访问令牌来自哪里。对我来说似乎有点不安全,但我会看看它是否有效!

Update

我用 Facebook 而不是 Google 实现了这个模式,它完全有效。 OAuth2 服务器不关心访问令牌来自哪里。至少 Facebook 没有,所以我想 Google 也没有。

鉴于此,存储访问令牌是一个非常非常糟糕的主意!但我们也不希望必须访问 Facebook/Google 的服务器来检查身份验证every请求,因为它会减慢一切。也许最好的办法是为您的网站添加一个额外的身份验证 cookie,在验证访问令牌时分发该 cookie,但更简单的方法是将访问令牌视为密码并存储它的哈希值。您也不需要加盐,因为访问令牌真的很长。所以上面的步骤就变成了这样:

9. MySite 需要使用访问令牌验证用户。首先,它检查其散列有效访问令牌的缓存。如果在那里找到令牌的哈希值,则表明用户已通过身份验证。否则它会与 Google 核实如此处所述 https://developers.google.com/accounts/docs/OAuth2Login#validatingtoken,与 Google - “Google,此令牌有效吗?”。

10. 如果 Google 说访问令牌无效,我们会通知用户 GTFO。否则谷歌会说“是的,这是一个有效的用户”,然后我们检查我们的注册用户数据库。如果找不到该 Google 用户名(如果使用 Facebook,则为 Facebook ID),我们可以创建一个新用户。然后我们缓存访问令牌的哈希值。


我刚刚发帖一个答案 https://stackoverflow.com/a/17606189/459863类似的 StackOverflow 问题。

谷歌称之为混合应用程序 https://developers.google.com/accounts/cookbook/platforms/Hybrid并解释了如何“Android应用程序获得Web后端的离线访问权限” https://developers.google.com/accounts/docs/CrossClientAuth#offlineAccess.

它的要点是你必须通过按摩scope串入GoogleAuthUtil.getToken为了让它返回授权代码(而不是 OAuth2 令牌)。根据规定,该授权代码可以从您的移动应用程序传递到您的服务器,并交换为 OAuth2 令牌和刷新令牌这个示意图 https://developers.google.com/accounts/docs/OAuth2#installed.

The scope参数需要看起来像这样:

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

使用 OAuth2 对应用程序*和*网站进行身份验证 的相关文章

随机推荐

  • 用于匹配 Apache 虚拟主机文件中的特定值的正则表达式

    我想匹配定义为的值ServerName ServerAlias and DocumentRoot用正则表达式 任何带有前缀的内容 可以忽略 我还想将每个虚拟主机的定义分开 因此在下面的示例中我有两个数组 Example
  • UIImagePickerController 允许编辑错误地裁剪图像,在顶部留下黑条

    我在 iPad 上的弹出窗口中使用 UIImagePickerController 用前置摄像头拍照 我将 允许编辑 设置为 是 并在拍照后获得令人敬畏的内置 移动和缩放 视图 尽管图像被裁剪为 320x320 的正方形 但此视图中的裁剪矩
  • 如何包含塞尔维亚语的 2 种变体?带有拉丁字母和西里尔字母

    我有一个 Android 应用程序 我想翻译成塞尔维亚语 并且我想要该语言的两种变体 拉丁字母和西里尔字母 我尝试过这个变体 value sr rRS Latn value sr Latn value sr rRS Cyrl value s
  • 登录成功后如何开始新的活动?

    我想在登录成功后开始一项新活动 也就是说 当登录正确时 新的活动应该自动启动 我不知道在哪里提到启动活动 请帮我解决这个问题 我是 Android 新手 这是我的代码 public class BackgroundTask extends
  • UIScrollView 移动到导航和状态栏下方

    我有包含滚动视图的视图 当视图显示时 图像会以全屏 320x480 形式显示 隐藏状态栏和导航栏 当我点击屏幕时 状态和导航栏出现在屏幕上 但是这个东西将 UIScrollView 移到了导航栏下方 我希望状态和导航栏显示在我的滚动视图上
  • 如何在 IntelliJ IDEA 13 中创建 JAXB 项目?

    我正在学习JAXB 我需要知道如何在 IntelliJ IDEA13 中为 JAX B 创建一个简单的 java 项目 如果有人有想法 请更新我并使用 IDEA 的任何插件更新我 Thanks 创建项目时 您无需执行任何特殊操作 只需一个简
  • 像在 Windows 7 中一样在进度条中进行一些渐变无限移动

    我想知道是否可以仅使用 CSS3 功能在 div 内从左到右无休止地进行渐变移动 不需要支持所有浏览器 我只是想尝试一下 示例是蓝色进度条顶部的闪亮效果 举一个例子表示赞赏 使用这个CSS你可以让渐变无限移动 基于link http www
  • 是否有更好的方法来实现可继承的方法,该方法返回继承该类类型的对象?

    我正在尝试创建一个基类 它指定一个返回的方法 比如它自己类型的列表 我希望这个方法能够在继承类上正确工作 即 返回继承类的列表 这是我能想到的唯一方法 public abstract class Base
  • Postgres 在并发更新插入时出现死锁

    我们有一个从数据流中读取信息并将该信息更新到数据库中的应用程序 数据是 Google Drive 上发生的变化 这意味着影响相同对象的许多事件可能会非常接近地发生 将此信息更新插入数据库时 我们遇到了死锁 日志中显示的内容如下 我已经重建并
  • Java AWT/Swing:获取有关窗口位置/大小变化的通知

    我有一个窗口 我希望在位置或大小发生变化时收到通知 哪种类型的听众最适合 WindowListener不适合我 您可以使用组件监听器 http docs oracle com javase tutorial uiswing events c
  • Django 说端口已被使用

    当我运行 Django 时runserver命令显示端口已在使用中 所以每次我都需要杀死使用该端口的进程并再次运行服务器 谁能给我一个永久的解决方案 您可以使用另一个端口 因为可能是port您正在使用的有一些问题 python manage
  • 通过反射获取给定类的可访问方法列表

    有没有办法获取给定类可访问 不一定是公共 的方法列表 有问题的代码将属于完全不同的类 Example public class A public void methodA1 protected void methodA2 void meth
  • 无法在 Mac 上将 JanusGraph 连接到本地 Cassandra

    我已在 Mac OS X 10 11 6 上安装并运行 Cassandra 3 11 1 跑步cqlsh在终端中打印以下消息 Connected to Test Cluster at 127 0 0 1 9042 cqlsh 5 0 1 C
  • Android 在 ListView 中获取精确的滚动位置

    我想获得 ListView 滚动的确切像素位置 不 我指的不是第一个可见位置 有办法实现这一点吗 好的 我找到了一个解决方法 使用以下代码 View c listview getChildAt 0 int scrolly c getTop
  • 内部框架与新的 C# 技术

    如果我们开发了自己的 ORM 框架 并且该框架多年来运行良好 那么我们为什么要学习和使用全新的 net 技术 例如LINQ or Entity Framework or NHibernate or CSLA NET对于我们即将进行的软件项目
  • 使用 Apache POI 将结果集转换为 Excel (*.xlsx) 表

    我正在尝试写结果集到 Excel xlsx 表使用 Apache Poi Office Excel 中的无效表对象错误 但是 即使它写入 Excel 文件时没有任何错误 但当我尝试在 Office Excel 2013 中打开它时 它会显示
  • 如何确定 Windows 当前是否正在播放任何声音?

    如何确定 Windows 当前是否正在通过主音频设备播放任何声音 我需要知道 这样我才能让我的程序自动调节音量 您可以使用 CSCore 在这里下载 gt http cscore codeplex com http cscore codep
  • 使用 matplotlib 显示网格中的值

    我正在尝试为一些数据生成热图 我的代码如下所示 data basis 2007 2008 1 2 2 3 4 2 0 2 2 3 4 1 2 5 4 5 8 1 2 5 5 4 3 6 6 1 4 5 9 x header data 0 1
  • 运行命令后存在来自 rocker/r-ver:4.0.4 的容器

    这是我的 Dockerfile FROM rocker r ver 4 0 4 在 cmd 中我构建 docker build t myfolder myimage 它塑造的形象很好 然后我跑 docker run myfolder myi
  • 使用 OAuth2 对应用程序*和*网站进行身份验证

    我正在开发一个主要通过应用程序访问的网站 我想使用 OAuth2 进行用户注册和身份验证 由于它是一个 Android 应用程序 我将开始使用 Google 的 OAuth2 东西 因为它在 Android 上提供了一个不错的 UI 谷歌表