我使用Rails +装束宝石(传送特性Sija分公司)+ omniauth - 谷歌 - 的oauth2宝石,我可以成功地使用用户登录,例如,当我们的应用程序正在生成谷歌Analytics(分析)API和提取数据进行验证:
Garb::Session.login('USERNAME', '<PASSWORD>')
然后我可以使用装束连接到分析简介欲,并从中提取数据,并在网页上显示一些图表。 这一切工作正常。
不过,我想使用的OAuth2与分析来验证这就是为什么我必须安装从GitHub外衣宝石(它支持的oauth2)的传送特性Sija分支,我也安装了omniauth - 谷歌 - 的oauth2宝石。 现在,在理论上我应该可以使用下面的代码进行验证:
Garb::Session.access_token = access_token # an instance of OAuth2::Client
这是在这一点上,它变得有点朦胧了我,我将不胜感激一些指导。 这里有多远,我已经得到了:
1)我在谷歌API控制台创建项目和服务下开启Analytics(分析)API
2)这给我提供了一个客户端ID和客户端密钥
3)我遇到了这个代码,我可以与ID和秘密上面填充:
client = OAuth2::Client.new(
GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET,
{
:site => 'https://accounts.google.com',
:authorize_url => '/o/oauth2/auth',
:token_url => '/o/oauth2/token'
})
4)然后有代码的下位:
response = OAuth2::AccessToken.new(
client,
STORED_TOKEN, {
refresh_token: STORED_REFRESH_TOKEN,
expires_at: STORED_EXPIRES_AT
})
5),然后在理论和连接:
Garb::Session.access_token = response
我的问题是,我没有在点(4)上述令牌信息。 在我看来,与我的oauth2需要做一个“握手”一次,并打印出返回的令牌值? 也许通过它打印返回的值出来,然后将令牌值粘贴到Rails应用程序的常数,这样我可以在上面的代码中使用Rails代码? 我真的很困惑。 正如我前面提到的,Web应用程序使用用户登录认证工作正常。 所有的web应用程序正在做的是与分析验证,拉低一些数据,并绘制图表。 但我坚持了将其转换到OAuth2, 我只是不知道如何获取外衣宝石正在寻找的访问令牌。 我还要指出的是,这不是一个公共网站与多个用户进行身份验证,这是一个CMS网站是连接到我们自己的分析数据。
我已经看到了这方面的一些部分片段,但不是一个充分的解释或工作的例子。 我会很感激的任何指导,并与这个问题有所帮助。
提前谢谢了,
JR
我已经通过这个在过去的几个星期当过兵,所以让我分担什么工作:
要使用的OAuth2你需要得到一个“刷新令牌”您使用在每次调用API时“重新认证”与谷歌。 对于此的步骤如下:
1)设置你的API控制台中的帐户- https://code.google.com/apis/console/b/0/ (好像你已经做了很好)2)在您的API帐户,请确保您有一个重定向URI指向回到您的应用程序:
http://some-url.com/auth/google_oauth2/callback
http://localhost:3000/auth/google_oauth2/callback
这里注意,谷歌不会让你为0.0.0.0:3000回调到本地机器...所以你需要使用localhost明确
3)在你的路由文件,配合重定向URL到一个动作在你要创建项目或认证控制器
match '/auth/:provider/callback' => 'authentications#create'
该“:提供”简单地让您在多种类型的OAuth的匹配,但你可以只是把“google_oauth2”有作为。
4)现在建立在你的控制器动作
def create
auth = request.env["omniauth.auth"]
params = request.env["omniauth.params"]
project = Project.find(params['project_id'])
Authentication.create(:project_id => project.id, :provider => auth['provider'], :uid => auth['uid'], :access_token => auth['credentials']['refresh_token'])
flash[:notice] = "Authentication successful."
redirect_to owner_view_project_path(project)
end
5)控制器操作应检索响应对象的相关字段响应对象这里的(详见: https://github.com/zquestz/omniauth-google-oauth2 ) -特别是,你需要得到“refresh_token”和即保存到您的项目或认证对象 - 如果你还没有加入“ACCESS_TOKEN”属性所需的对象,去请以迁移,然后开始保存刷新令牌给该属性
6)现在,当你准备调用特定的认证,并获得API数据,你可以加载该对象在保存该访问令牌,并使用如下得到与谷歌API的新会话:
@authentication = Authentications.find(params[:id])
client = OAuth2::Client.new GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET,
{
:site => 'https://accounts.google.com',
:authorize_url => "/o/oauth2/auth",
:token_url => "/o/oauth2/token",
}
response = OAuth2::AccessToken.from_hash(client, :refresh_token => @authentication.access_token).refresh!
Garb::Session.access_token = response
@profiles = Garb::Management::Profile.all
这段代码所做的是通过指定的客户端,然后一个refresh_token,然后调用建立OAuth2访问令牌(响应)'刷新! 得到刷新访问令牌......然后使用该访问令牌来建立你的装束会话,然后调用了所有的配置文件使用加尔::管理:: Profile.all指定帐户
希望这有助于 - 让我知道,如果你有任何问题!
对我什么工作刚一说明:
对于步骤3,4 5 I用于卷曲代替检索访问/刷新令牌。 步骤6是那么对于我的相同(使用装束宝石的传送特性Sija分支)。 使用curl:
使用与您的谷歌应用程序POST以下使用卷曲相关的详细信息:
curl --data "code=<APP_CODE>&redirect_uri=http://localhost:3000/oauth2callback&client_id=<CLIENT_ID>.apps.googleusercontent.com&scope=&client_secret=<CLIENT_SECRET>&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token
响应采用以下形式:
{
"access_token" : "<ACCESS_TOKEN>",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "<REFRESH_TOKEN>"
}
你可以插入装束宝石按照第6部分。
通过@CamNorgate答案是有效的。
如果你没有一个“refresh_token”从Omniauth回到了回调确保您正确初始化:google_oauth2
Rails.application.config.middleware.use OmniAuth::Builder do
provider :google_oauth2, ENV["GOOGLE_CLIENT_ID"], ENV["GOOGLE_CLIENT_SECRET"],
{ :scope=>"https://www.google.com/m8/feeds, https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/userinfo.profile",
:approval_prompt=>"force", access_type="offline"
}
end
确保包括:approval_prompt =>“力”,ACCESS_TYPE =“离线”为了要发送的refresh_token回来。 所述refresh_token只提供对来自用户的第一授权 。