jjzjj

ios - 跨客户端谷歌 OAuth : Get auth code on iOS and access token on server

coder 2023-09-25 原文

我正在尝试使用我的 iOS 应用程序和 Rails 网络应用程序设置 Google OAuth。我在 API 控制台中设置了 2 个独立的客户端(当然具有不同的客户端 ID,但具有相同的前缀)。一个用于 iOS 应用程序,另一个用于网络应用程序(它也有一个 client_secret。我想在 iOS 上使用 AppAuth SDK 获取用户的授权代码,然后将其发送到我的网络应用程序,然后执行访问 token 的交换。

首先,这听起来像是一件合理的事情,还是不可能像那样在客户之间拆分交易?

我的第一次尝试是获取授权码并执行交换,但是由于 missing_code_verifier invalid_grant 错误而失败,所以我也通过了相同的 code_verifier AppAuth 用于将授权代码获取到我的服务器,并修复了该错误。首先,是否需要将这个code verifier传递给服务端?好像有点奇怪。

但是现在,它因 unauthorized_client 错误而失败。我的网络应用正在发出这样的请求:

{
  "grant_type"=>"authorization_code",
  "code"=>"4/XYZ...",
  "client_id"=>"WEB_APP_CLIENT_ID_HERE.apps.googleusercontent.com", 
  "client_secret"=>"WEB_APP_CLIENT_SECRET_HERE", 
  "redirect_uri"=>"https://www.myapp.com/oauth_callback", 
  "parse"=>"json",
  "code_verifier"=>"CODE_VERIFIER_STRING_HERE"
}

查看像这样的帖子:

看起来 redirect_uri 可能是这里的问题。我在 iOS 上的 AppAuth 配置将重定向 URI 设置为 com.googleusercontent.apps.iOS_CLIENT_ID_HERE,以及 Info.plist URL 方案。 API 控制台中 Web 应用程序的“授权重定向 URI”部分有一堆 Web URL,我也向其中添加了 com.google...。这个配置不正确吗? redirect_uri 在进行跨客户端身份验证时是否重要?

非常感谢任何帮助!到目前为止,我所有的反复试验都没有结果:(

最佳答案

我是 AppAuth 的主要维护者,在 Google Identity Platform 上工作;希望我能提供帮助。

I want to use the AppAuth SDK on iOS to get the user's auth code, then send that to my web app, which will then perform the exchange for the access token.

First of all, does this sound like a reasonable thing to do, or is it not possible to split the transaction across clients like that?

在您的服务器上交换代码听起来很合理,但我认为您使用的配置可能不正确。如果您在服务器上请求交换代码,请在向授权服务器的请求中使用服务器的客户端 ID。根据您的描述,您的授权服务器请求听起来像是在发送您的 iOS 客户端 ID,然后您正在与您的服务器客户端 ID 进行交换,我相信这就是您看到“unauthorized_client”错误的原因。

这没有很好的记录,对此深表歉意。 this section中提到关于“离线访问”的文档的一部分,尽管它纯粹是通过 GoogleApiClient 在 Android 使用方面谈论它。

is it necessary to pass this code verifier to the server? Seems a little strange.

PKCE 背后的意图是确保发出授权请求的实体与发出代码交换请求的实体相同。 code_verifier 在正常情况下不应离开设备。

但是,如果您使用后端控制的客户端 key 交换代码,则没有必要使用 PKCE;对于这种情况,您可以在 AppAuth 中禁用 PKCE。

关于ios - 跨客户端谷歌 OAuth : Get auth code on iOS and access token on server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42105485/

有关ios - 跨客户端谷歌 OAuth : Get auth code on iOS and access token on server的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  5. ruby-on-rails - 使用 gmaps4rails 动态加载谷歌地图标记 - 2

    如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail

  6. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  7. ruby-on-rails - Rails 两条腿的 OAuth 提供商? - 2

    我有一个Rails2.3.5应用程序,其中包含我希望保护的API。没有用户-它是一个应用到应用风格的网络服务(更像是亚马逊服务而不是facebook),所以我想使用两条腿的OAuth方法来实现它。我一直在尝试使用oauth-plugin服务器实现作为开始:http://github.com/pelle/oauth-plugin...但它的构建需要三足(网络重定向流)oauth。在我深入研究对其进行更改以支持两条腿之前,我想看看是否有更简单的方法,或者是否有人有更好的方法让Rails应用程序实现成为两条腿的OAuth提供程序。 最佳答案

  8. ruby - 如何使用 omniauth/oauth 对每秒登录数进行基准测试? ( ruby +rspec) - 2

    我想用一个(自己的)omniauth提供商来衡量每秒可以登录多少次。我需要了解此omniauth/oauth请求的性能如何,以及此身份验证是否具有可扩展性?到目前为止我得到了什么:defperformance_auth(user_count=10)bm=Benchmark.realtimedouser_count.timesdo|n|forkdoclick_on'Logout'omniauth_config_mock(:provider=>"foo",:uid=>n,:email=>"foo#{n}@example.net")visit"/account/auth/foo/"enden

  9. ruby-on-rails - 为什么我必须在使用客户验证器后重新加载 rspec 中的记录? - 2

    我有一个模型User,它在创建后的回调中创建了选项#Userhas_one:user_optionsafter_create:create_optionsprivatedefcreate_optionsUserOptions.create(user:self)end我对此有一些简单的Rspec覆盖:describe"newuser"doit"createsuser_optionsaftertheuseriscreated"douser=create(:user)user.user_options.shouldbe_kind_of(UserOptions)endend一切正常,直到我将自

  10. ruby-on-rails - 如何编写 Rails 4 测试以使用 omniauth-google-oauth2 gem 创建 session ? - 2

    我正在尝试为使用omniauth-google-oauth2gem创建session编写测试。我是否需要将env["omniauth.auth"]变量与post:create一起传递?也许当我试图这样做时,我做错了。我得到的错误如下所示...Rake测试错误1)Error:SessionsControllerTest#test_should_get_create:NoMethodError:undefinedmethod`provider'fornil:NilClassapp/models/user.rb:6:in`from_omniauth'app/controllers/sessi

随机推荐