我们在使用Oauth2.0进行SSO开发新版Google Apps Marketplace的应用程序时遇到了问题。
作为我们应用程序的一部分,我们在离线模式下使用Google Calendar V3 API - 这意味着我们需要为我们的客户保留“ refresh_token ”。
为了在第一次OAuth2.0身份验证期间获取'refresh_token',我们需要配置google_oauth2.0提供程序(使用omniauth-google-oauth2 gem),例如:
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如何在不提示最终用户的情况下支持离线访问?
答案 0 :(得分:3)
看起来我正在寻找离线访问的服务帐户。
受此主题的启发: Trouble with Google Apps API and Service Accounts in Ruby
我发现我可以在应用市场配置上创建服务帐户。 项目 - > API&验证 - >凭证 - >创建新客户端ID - >选择服务帐户。 在我的代码中使用Signet为最终用户提供域级授权:
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!
这不仅允许我进行身份验证而不会在此过程中的任何阶段提示最终用户 - 但我不再需要refresh_token,我可以使用域级别授权执行API调用。 person选项允许我指定使用API调用的最终用户。
答案 1 :(得分:0)
正如此问题(Google Apps Marketplace SDK + Domain-wide OAuth 2 SSO)中所述,如果您要求从应用程序进行脱机访问,则在执行OAuth2.0时,将始终向域用户提示授权页面。
但是,我不认为这会否认SSO概念,因为离线权限只会在用户第一次访问您的应用时提供。授予权限后,您的应用将不会再次请求它们(如果您的库中的提示:'consent'参数转换为approval_prompt:'auto',就像它在OAuth2.0登录文档中一样)。