我正在努力将 Google Apps 集成到我的 PHP 应用程序中。我已经有一个登录系统,它为用户分配一个 session ID(在输入用户名和密码后),当用户登录时该 session ID 存储在数据库中。 session ID 在一段时间不活动后变得无效(可由用户配置,可以是 5 分钟、15 分钟、60 分钟...)。该 session ID 在 url 中传递,以检查用户是否仍处于登录状态。注销时, session ID 将从数据库中删除。
我让人们通过将他们的 Google ID 存储在数据库中来使用 Google 登录,当他们登录时,我请求一个访问 token ,查询用户信息,查看 google ID 是否在数据库中,如果是,则分配一个 session 此用户的 ID。因为我希望能够查询其他 API,所以我还将访问 token json 存储在数据库中。当用户注销时,访问 token 也会从数据库中删除。
这行得通,我的用户可以使用他们的 Google 帐户登录,我可以使用存储的 access_token 查询 API,但是有些笨拙的东西让我对我的工作流程感到不确定:
如果你 force_approval 你得到一个 refresh_token,我觉得我应该使用这个刷新 token 来获得一个新的访问 token ,而不是从数据库中删除旧的并在用户登录时输入一个新的再次。另一方面,登录时,我还不知道是谁,所以我不知道该使用哪个刷新 token 。也许我误解了刷新 token 的用途。另外,我真的不想每次都强制批准,所以在那种情况下我什至不能使用 refresh_token。
如前所述,用户可以决定他们的 session 将持续多长时间,但是,google access_token 总是在 3600 秒后过期。如果用户在系统上工作一个小时后 Google API 突然失败,迫使他们重新登录,那将是非常愚蠢的。 Google OAuth Playground 显示了一个复选框“ token 过期前自动刷新”,但我不知道如何执行此操作。我必须在这里使用刷新 token 吗?或者只是在后台请求一个新 token (如果我不强制批准)?
目前,我正在使用 userinfo 查询 (https://www.googleapis.com/oauth2/v2/userinfo) 来查找用户 ID,但我也可以使用 tokeninfo (https://www.googleapis.com/oauth2/v1/tokeninfo)。 Tokeninfo 没有在 oauth playground 中列出,但结果确实显示了 token 保持有效的时间(但是,我也可以自己计算)。一个比另一个更可取吗?
我将整个 json 对象存储在数据库中(access_token、id_token、expires_in 和 token_type),但我觉得如果我只存储 access_token,我的应用程序仍然可以完美运行(我预见的唯一问题是如果 expires_in时间变化)。例如,我需要存储 id_token 吗?
我发现 Google 文档(位于 developers.google.com)有时非常缺乏,如果有人知道任何其他好的信息来源,我也对它们感兴趣。
最佳答案
我认为如果您看一下最新的 OpenID Connect Specs 可能会有所帮助userinfo 端点等概念的来源。 OpenID connect 建立在 OAuth 2 之上。其中有很多内容,但仍然值得一看。 This blog article也非常好(同一个博客中的其他人也是如此)。
不幸的是,我不认为 Google 的实现目前与最新的规范草案保持同步,因此它可能会在一段时间内成为一个移动的目标。在过去的一年里,这些事情发生了很大变化。
我同意您的第一点,即您应该在每次对用户进行身份验证时获取新的访问 token ,而不是刷新旧的访问 token 。在用户登录并授予您访问 token 之前,您不知道用户是谁。通常,访问 token 的生命周期与用户 session 无关。一旦发布,您的应用程序理论上可以使用它独立于用户的存在来访问资源。如果您想在 token 过期时间后继续访问资源,则需要在该时间点提交刷新 token 以获取新的访问 token 。恐怕我不知道“自动刷新”功能是干什么用的。
我相信谷歌的 tokeninfo类似于 check_id OpenID 连接的端点,但接受访问 token 或 ID token ,而不仅仅是后者。请注意,两者的到期时间可能不同。您通常能够从 userinfo 中检索更详细的用户数据。端点比 check_id ,这通常会返回裸 user_id .
您不需要存储 id_token .有点像授权服务器对用户认证的记录。一旦您验证了用户身份,访问 token 就是您的应用程序将有兴趣维护的内容。
关于php - Google Apps 和 OAuth 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9634854/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我似乎经常遇到一些设计问题,但我不知道是什么是真的很合适。一方面我经常听到我应该限制耦合和坚持单一职责,但当我这样做时,我常常发现它很困难到在需要时将信息获取到程序的一部分。为了例如,classSingerdefinitialize(name)@name=nameendattr:nameend那么Song应该是:classSongdefnew(singer)@singer=singerendend或classSongdefnew(singer_name)@singer_name=singer_nameendend后者耦合性小,按道理应该用。但如果我以后发现宋有什么需要了解更多歌手,我的
我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http
我有一个像这样的ruby散列{"stuff_attributes"=>{"1"=>{"foo"=>"bar","baz"=>"quux"},"2"=>{"foo"=>"bar","baz"=>"quux"}}}我想把它变成一个看起来像这样的散列{"stuff_attributes"=>[{"foo"=>"bar","baz"=>"quux"},{"foo"=>"bar","baz"=>"quux"}]}我还需要保留键的数字顺序,并且键的数量是可变的。上面是super简化的,但我在底部包含了一个真实的例子。执行此操作的最佳方法是什么?附言还需要递归就递归而言,这是我们可以假设的:1)
参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin
我有一个Rails2.3.5应用程序,其中包含我希望保护的API。没有用户-它是一个应用到应用风格的网络服务(更像是亚马逊服务而不是facebook),所以我想使用两条腿的OAuth方法来实现它。我一直在尝试使用oauth-plugin服务器实现作为开始:http://github.com/pelle/oauth-plugin...但它的构建需要三足(网络重定向流)oauth。在我深入研究对其进行更改以支持两条腿之前,我想看看是否有更简单的方法,或者是否有人有更好的方法让Rails应用程序实现成为两条腿的OAuth提供程序。 最佳答案