1

我们在为使用Oauth2.0进行SSO的新Google Apps Marketplace开发应用程序时遇到了问题。Ruby on Rails上的新Google Apps Marketplace Oauth2.0实施问题

作为我们应用程序的一部分,我们在离线模式下使用Google Calendar V3 API - 这意味着我们需要为我们的客户保留'refresh_token'。

为了得到我们需要配置google_oauth2.0提供商第一的OAuth2.0身份验证在“refresh_token”(使用omniauth - 谷歌 - 的oauth2宝石),如:

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :google_oauth2, CONFIG[:app_id], CONFIG[:app_secret], { 
    access_type: 'offline', 
    prompt: 'consent' } 
end 

如果不指定access_type:'离线,并提示:'同意'我们没有收到refresh_token,并且无法正确使用日历API。

但是,指定提示符''consent''属性会导致授权弹出窗口,这会取消整个SSO想法 - 其中只有在安装过程中会提示域管理员。

是否可以在不提示域用户的情况下获取refresh_token? 新的Google Apps Marketplace如何在不提示最终用户的情况下支持离线访问?

回答

3

它看起来像离线访问的服务帐户是我正在寻找。

此线程的启发: Trouble with Google Apps API and Service Accounts in Ruby

我发现我可以创建在Apps Marketplace中配置的服务帐户。 项目 - > API &验证 - >证书 - >创建新的客户端ID - >选择服务帐户。 在我的代码中使用徽记,为最终用户提供域级别的授权:

key = Google::APIClient::PKCS12.load_key('privatekey.p12', 'notasecret') 
client = Google::APIClient.new 

client.authorization = Signet::OAuth2::Client.new(
     :token_credential_uri => 'https://accounts.google.com/o/oauth2/token', 
     :audience => 'https://accounts.google.com/o/oauth2/token', 
     :scope => 'https://www.googleapis.com/auth/calendar', 
     :issuer => '<email-address-of-service-account>@developer.gserviceaccount.com', 
     :signing_key => key, 
     :person => email) 
client.authorization.fetch_access_token! 

这不仅让我没有在此过程中的任何阶段提示最终用户进行身份验证 - 但我不” t不再需要refresh_token,我可以使用域级授权执行API调用。 person选项允许我指定哪个最终用户使用API​​调用。

+1

您是对的 - 服务帐户是在用户不在键盘时打开API调用并且不会破坏SSO的唯一方式。这是因为通过Google Apps Marketplace安装的应用无法请求刷新令牌。我们正在探索如何以安全的方式允许刷新令牌。 – jonathanberi

0

正如在这个问题(Google Apps Marketplace SDK + Domain-wide OAuth 2 SSO)中回答的那样,如果您要求从您的应用程序进行脱机访问,则在执行OAuth2.0时,域用户总是会收到授权页面的提示。

不过,我不认为这否认了SSO的概念,因为离线权限将只给予第一次用户访问您的应用程序。 (:“同意”参数将存储库有翻译成approval_prompt:“自动”就像是OAuth2.0的登录文件中,如果提示)给予的权限您的应用程序将不会再询问他们后。

+0

我不完全确定这是正确的。 由于可以在这里看到:市场文档(https://developers.google.com/apps-marketplace/building)(下“从离线访问Web服务器应用程序使用谷歌服务”),新的市场是假设以支持某种离线访问。 作为描述有很模糊,我不知道这是否回答我的情况或没有。 我想听听解决这个问题的最佳方式是什么(在新的应用程序市场中离线访问),因为我无法从文档中理解它并提示用户同意似乎是一种不好的做法。 –