Google身份验证for YouTube无法在Rails

时间:2018-02-13 12:48:54

标签: ruby-on-rails youtube rubygems google-oauth2

我正在使用Rails 5.1.1和yt gem 0.28

我使用官方宝石文档(链接在上面)。

这些文档Github

并尝试在SitePoint

上查看本教程

如果您查看SP教程下面的评论 - 存在同样的问题,但是所有者已删除问题,因此我无法使用它。

宝石似乎工作正常。至少在我放置时:

video = Yt::Video.new id: 'BPNYv0vd78A' 
在video_controllers.rb中

然后询问video.description,它回答说明。所以我们在这里打勾。

我按照说法来配置YT:

Yt.configure do |config|
    config.log_level = :debug
    config.client_id = "[my_client_id].apps.googleusercontent.com"
    config.client_secret = "[my_secret_key]"
    config.api_key = '[my_api_key]'
end

我从google_oauth2复制了值,所以如果它没关系,那么它也一定没问题。

但是当我尝试使用涉及身份验证的任何事情时,会发生一些非常奇怪的事情。

FIRST PART - 访问令牌

根据手册,如果我有访问令牌,我可以:

account = Yt::Account.new access_token: 'ya29.[authenticating_user_token]'
account.email 

以下是消息:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "authError",
    "message": "Invalid Credentials",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Invalid Credentials"
 }
}

它还提供curl命令来模拟此操作:

curl -X GET -H "content-length: 0" -H "user-agent: Yt::Request (gzip)" -H "authorization: Bearer ya29.[authenticating_user_token]" -H "host: www.googleapis.com" "https://www.googleapis.com/oauth2/v2/userinfo?key=[my_api_key]"

authenticating_user_token与我从google auth json获得的内容相同,如user.auth_hash["credentials"]["token"] my_api_key与Google Developers Console中的密钥相同。

当我通过byebug请求帐户的价值时,它给了我:

#<Yt::Models::Account:0x000000051473f0 @access_token="ya29.[authenticating_user_token]", @refresh_token=nil, @device_code=nil, @expires_at=nil, @authorization_code=nil, @redirect_uri=nil, @force=nil, @scopes=nil, @authentication=nil>

第一个没有回答的问题:“ 如果文档说我需要的只是access_token,为什么会使用api密钥?

SECOND PART refresh_token

实际上,在带有访问令牌的惨败之后,我认为可能是那个

"credentials"=>{"token"=>"ya29.[authenticating_user_token]",
"expires"=>true,
"expires_at"=>1518443279}

是神秘的刷新令牌!

它给了我相同的'无效凭据'

所以我修改了videos_controller.rb:

      account = Yt::Account.new(refresh_token: user.auth_hash["credentials"]["token"],
      expires_at: user.auth_hash["credentials"]["expires_at"],
      expires: user.auth_hash["credentials"]["expires"])

这次与byebug我得到了帐户的价值:

#<Yt::Models::Account:0x00000007a6e5a8 @access_token=nil, @refresh_token="ya29.[you know_what]", @device_code=nil, @expires_at=1518443279, @authorization_code=nil, @redirect_uri=nil, @force=nil, @scopes=nil, @authentication=nil, @user_infos=#<Yt::Collections::UserInfos:0x00000007a305a0 @parent=#<Yt::Models::Account:0x00000007a6e5a8 ...>, @auth=#<Yt::Models::Account:0x00000007a6e5a8 ...>, @page_token=nil, @last_index=0, @items=[]>, @refreshed_authentications=#<Yt::Collections::Authentications:0x007ff0080054b0 @parent=#<Yt::Models::Account:0x00000007a6e5a8 ...>, @auth=#<Yt::Models::Account:0x00000007a6e5a8 ...>, @auth_params={:client_id=>"[my_client_id].apps.googleusercontent.com", :client_secret=>"[my_client_secret]", :refresh_token=>"[you_know_what]", :grant_type=>:refresh_token}, @page_token=nil, @last_index=1, @items=[], @where_params={}>>

请求account.email:

*** Yt::Errors::Unauthorized Exception: A request to YouTube API was sent without a valid authentication:
{}

You can retry the same request manually by running:





nil

第二个问题:“ 是否刷新令牌?

在YouTube帐户中,我有一个工作频道,因此无法理由。

我将不胜感激!如果您有任何与YouTube合作的应用,请分享指向Github的链接,以便我可以找出我的应用有什么问题!

2 个答案:

答案 0 :(得分:1)

嗯,这就是尴尬 - 没有人试图帮助......

我仍然找到了错误的来源。 因此,来自身份验证[&#34;凭证&#34;] [&#34;令牌&#34;]的令牌是访问令牌。

我遇到的问题是因为我没有在config / initializers / device.rb中指定:scope 它应该是:

config.omniauth :google_oauth2, "[client_id_from_google_developers_console].apps.googleusercontent.com", "[key_from_google_developers_console]", scope: 'userinfo.profile, userinfo.email, youtube'

此外,我注意到令牌过期时出现错误,因此您应该执行类似开始救援的操作,以便及时更新用户的令牌。

答案 1 :(得分:-5)

btn-group
use this class for the button div like <div class="btn-group"></div>
and apply 

btn-group button:hover {
    background-color: #3e8e41;
}

.btn-group:after {
    content: "";
    clear: both;
    display: table;
}

.btn-group button:not(:last-child) {
    border-right: none; 
}