使用 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 对应用程序*和*网站进行身份验证 的相关文章

  • 使用 google Directions API 的地图视图绘制方向 - 解码折线

    我正在尝试使用 Google 方向 API 在我的地图视图上显示方向 但我在从 JSON 响应获取数据时遇到困难 我可以获得 级别 和 点 字符串 但无法弄清楚如何将它们解码为地图上的点 任何帮助将非常感激 我有一个类可以为您解码它们 添加
  • Android 在打开应用程序时会广播吗?

    例如 如果我想知道Youtube何时打开 是否有与之相关的广播 我当然知道我可以轮询 logcat 消息来检查活动 但我可以通过广播来做到这一点吗 因为它会少得多的耗电 此链接似乎表明这是不可能的 如何跟踪 Android 中的应用程序使用
  • 从 Android 代码设置的 SECRET_CODE

    我知道如何使用清单文件中的秘密代码 它与此源代码配合良好
  • 安卓定位不准确

    我正在尝试获取当前用户的位置 我试图重构我的代码以获得更好的结果 但我只是不断得到关于准确度的荒谬位置 它在 900 600 米之间 如何才能得到更好的结果 使其精度达到50m以内 这是我的代码 package com agam mapsl
  • Android 如何更改 OnTouchListener 上的按钮背景

    你好 我在 xml 中有一个按钮 我正在使用OnTouchListener在我的活动中获得button按下并释放 但问题是 当我按下按钮时背景颜色没有改变 当我延长可能的活动时OnClickListener背景正在改变 任何人都可以告诉我的
  • ffmpeg视频已压缩但无法在浏览器中播放

    我已经集成了ffmpeg4android lib 视频压缩工作正常 但视频无法在除 safari 浏览器之外的浏览器中播放 上传到服务器后 我使用了以下命令 ffmpeg y i
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • 出现错误错误:res/menu/mainMenu.xml:文件名无效:必须仅包含[a-z0-9_。]

    我是安卓新手 刚刚开始使用 我在 res 文件夹中创建了一个文件 menu mainMenu xml 但我得到了错误 Error res menu mainMenu xml invalid file name must contain on
  • 如何检查用户在EditText中输入自己的电话号码?

    用户将在我的 Android 应用程序的注册页面上的编辑文本中输入手机号码 如何检查用户输入的是他 她的手机号码而不是其他人的 我试过这个 TelephonyManager tMgr TelephonyManager mAppContext
  • Android Studio:未找到 Gradle DSL 方法:“classpath()”

    首先 我已阅读所有其他解决方案帖子以及有关迁移到 1 0 的官方文档 到目前为止 还没有任何效果 Error Error 23 0 Gradle DSL method not found classpath Possible causes
  • 如何在 Android 模块中使用 FirebaseAuth

    我正在开发一个聊天库 我想在其中显示登录用户的对话 制作该库的原因是我想将其集成到多个项目中 我现在面临的问题是FirebaseAuth表示用户尚未登录 FirebaseAuth getInstance mFirebaseApp getCu
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 如何在 Viewpager 中禁用预加载下一页? [复制]

    这个问题在这里已经有答案了 如何在 Viewpager 中禁用页面预加载 I tried viewPager setOffscreenPageLimit 0 但它不起作用 用这个viewPager setOffscreenPageLimit
  • 如何在android asynctask中使用inputstream作为参数?

    我正在制作一个 Android 应用程序来跟踪股票详细信息 我将通过 csv 雅虎财经 检索数据 据我所知 在android 4 0中 网络连接无法在主线程上完成 因此 我将使用 asynctask 来建立连接 但是 我在参数方面遇到了一些
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • 尝试将 SQLite DB 从数据复制到 SD 卡

    我正在使用以下代码 该代码发布在 Stack Overflow 上的某个位置 并根据我的目的进行了修改 try File sd Environment getExternalStorageDirectory File data Enviro
  • 在Android Studio gradle项目中使用NDK和STL

    我在将 stlport 链接到 Android Studio 中的 gradle 项目时遇到问题 使用 NDK 的 Eclipse Android 项目迁移到 Android Studio 该项目使用 STL 我有包含内容的 android
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组

随机推荐

  • 用于匹配 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 谷歌表