在为新的Google市场开发应用程序时,我们遇到了一个问题,该应用程序使用Oauth2.0forSSO。
作为应用程序的一部分,我们在离线模式下使用Google V3 API --这意味着我们需要为客户端保留一个V3。
为了在第一次OAuth2.0身份验证期间获得“refresh_token”,我们需要配置google_oauth2.0提供者(使用oauth2 Google-OAuth2GEM),例如:
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。
但是,指定提示符:“同意”属性会导致一个授权弹出,这否定了整个SSO的想法--在安装过程中,只有域管理员才会得到提示。
是否可以在不提示域用户的情况下获得refresh_token?新的谷歌应用程序市场如何支持离线访问而不提示终端用户?
发布于 2014-01-20 17:32:47
它看起来像一个服务帐户的离线访问是我要找的。
受这个线程的启发:Trouble with Google Apps API and Service Accounts in Ruby
我发现我可以在应用程序市场配置上创建一个服务帐户。项目-> API& Auth ->凭据->创建新客户端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调用的最终用户。
发布于 2014-01-20 12:12:39
正如在这个问题( Google Apps Marketplace SDK + Domain-wide OAuth 2 SSO )中回答的那样,如果您请求从应用程序中离线访问,则在执行OAuth2.0时始终会提示域用户使用授权页。
但是,我认为这并不否认SSO的概念,因为离线权限只会在用户第一次访问您的应用程序时才会被授予。在授予权限之后,您的应用程序将不再请求它们(如果库中的提示:“同意”参数被转换为批准_提示符:‘auto’,就像在OAuth2.0登录文档中那样)。
https://stackoverflow.com/questions/21221244
复制相似问题