在基于 Android 的嵌入式设备上使用 Google OAuth 2
Posted
技术标签:
【中文标题】在基于 Android 的嵌入式设备上使用 Google OAuth 2【英文标题】:Using Google OAuth 2 on embedded Android-based device 【发布时间】:2017-08-14 08:15:24 【问题描述】:我们有一个基于 android 的嵌入式设备应用程序,它使用 WebView,在其中我们使用 Google OAuth 2 登录到应用程序。不幸的是Google will soon block OAuth 2 inside WebView,我们有很多限制:
该设备未安装 Google 服务,因此可能没有'official' way of logging in 可以工作(或者,如果没有 Google 服务,它们中的任何一个都可以工作?) 我们不能只调用Android浏览器进行登录,因为它显示地址栏,这将允许用户上网,我们不允许这样做 我们无法完全控制设备上安装的软件:无法安装 Google 服务、更新 Android 版本、安装 Google Chrome 等...,我们只能更新我们的应用。有了这些限制,我们还能做什么?
【问题讨论】:
您的应用需要用户授权才能访问自己的资源?如果没有,那么您可能不需要 OAuth。 Oauth 不是身份验证 不幸的是,这些是我们客户的要求,他们有我们必须用于身份验证的谷歌应用帐户。 要清楚,OAuth 不是身份验证。 Google 的身份验证至少需要一个网络浏览器(2FA 需要更多),这是没有办法的。 您是否尝试过将 oauth 流程用于电视和嵌入式设备?看看这里:developers.google.com/identity/protocols/OAuth2ForDevices 【参考方案1】:您需要使用 OAuth Web 服务来根据您的需要实施解决方案。
参考链接:https://developers.google.com/+/web/api/rest/oauth
这是一个使用 OAuth 2 Web 服务登录 Twitter 的示例 github 项目。您可以从它那里获得帮助,以便在您的 Android 应用程序中使用 Google 的 OAuth2 网络服务。
存储库链接:https://github.com/sathify/tagpulse
Web服务消费画面链接: https://github.com/sathify/tagpulse/blob/master/android/src/tag/pulse/main.java
我希望这会有所帮助。
【讨论】:
这是关于 oauth 1,google 多年不支持它【参考方案2】:Google OAuth 2 有一个支持 Android 1.5 及更高版本的库:
在此处找到示例代码:
https://github.com/google/google-api-java-client-samples/blob/master/oauth2-cmdline-sample/src/main/java/com/google/api/services/samples/oauth2/cmdline/OAuth2Sample.java
【讨论】:
这仍然是基于浏览器的 oauth 好的,该应用支持什么Android API版本? 设备没有安装谷歌服务!! - 你认为这将如何完成] developers.google.com/api-client-library/java/… 它使用 AccountManager 请阅读第二个链接,当您拥有 Google 服务时,第一个链接似乎指向 OAuth 2 我已经编辑了答案 您是正确的@Aloy A Sen,所以我已经编辑了答案,在这种情况下,您需要用于 OAuth 2 的 Google 客户端 API 库,该链接具有误导性,但找到了正确的代码【参考方案3】:根据您这边的问题,最好从应用程序内打开一个针对登录 Weburl 的 Intent [这不会触发地址栏链接]
参考这个 *** 页面 how to open "Add a Google Account" activity using intent?
现在您可以使用共享首选项来存储身份验证数据以供进一步登录 [如果应用要求允许的话。]
https://developer.android.com/reference/android/content/SharedPreferences.html
【讨论】:
【参考方案4】:通过浏览器实现:
1)注册自定义URI方案(How to implement my very own URI scheme on Android),例如app-oauth2://
2) 在用户浏览器中发出访问请求
https://accounts.google.com/o/oauth2/v2/auth?
scope=...
access_type=offline&
include_granted_scopes=true&
state=state_parameter_passthrough_value&
redirect_uri=http://example.com/oauth2-handler&
response_type=code&
client_id=...
3) 如果用户在确认对话框中接受或拒绝请求的权限,它将被重定向到 redirect_uri (http://example.com/oauth2-handler) 并带有一些参数
4) 在 redirect_uri 处理程序 (http://example.com/oauth2-handler) 一侧,使用参数重定向到自定义 URI 方案:
成功: app-oauth2://?state=state_parameter_passthrough_value&code=...&scope=...# 失败: app-oauth2://?error=access_denied&state=state_parameter_passthrough_value#5) 在您的应用中,您可以从选项 4 解析 URI 方案 app-oauth2:// 并接收代码以供将来使用或向用户显示错误。
【讨论】:
似乎是一个可行的解决方案。有什么想法可以与 Cordova 一起使用吗? 如果 Cordova 支持自定义协议处理和打开用户浏览器的可能性 - 是的。以上是关于在基于 Android 的嵌入式设备上使用 Google OAuth 2的主要内容,如果未能解决你的问题,请参考以下文章