9

私はこのオンラインでの回答を見つけることができませんでした.Googleログインボタンを使用する以外は、私はこの時点では使用したくありません。なぜなら、私がドンであればJavascriptに入りたくないからですそうしなければならない。Rails、OmniAuth、google_oauth2、google-api-client、Moments.insert ... 401 unauthorized ...なぜですか?

Ruby on Railsアプリケーション(ruby v1.9.3、rails v3.2.13)で、OmniAuthを接続してgoogle_oauth2 gemを使用してGoogle+と統合しています。

簡単な目標は、ユーザーがGoogle+で認証し、Google APIプロジェクトにアクセスできるようにしてからgoogle-api-client gemを使用してGoogle+ユーザーの金庫に瞬間を投稿できるようにすることです。

私は既にGoogle APIプロジェクトをセットアップし、Webアプリケーション用のOAuth 2.0を作成し、Google + APIサービスを有効にしました。

次のプロバイダーでOmniAuthをセットアップしました。私は投稿を許可するためにrequest_visible_actionsオプションを追加しました(これは正しいと思いますが、これは私がオンラインで見たコード例では使用されていません。 。):

provider :google_oauth2, CLIENT_ID, CLIENT_SECRET, { 
    access_type: 'offline', 
    scope: 'userinfo.email,userinfo.profile,plus.me,https://www.googleapis.com/auth/plus.login', 
    request_visible_actions: 'http://schemas.google.com/AddActivity', 
    redirect_uri: 'http://localhost/auth/google_oauth2/callback' 
} 

私は私のユーザーをリダイレクトする/認証/ google_oauth2、それは私のアプリを承認するには、Google +をユーザーに送信し、ユーザーが承認したときに、それは私がrequest.envにアクセスすることができ、私のコールバックに戻ります["omniauth.auth"]、トークン、電子メールアドレスなど、私が期待するすべての情報を持っています。私はauth ["credentials"] ["token"]からaccess_tokenを保存しています。

これまでのところ、とても良いですよね?

次のコードを使用して瞬間を投稿しようとすると、401の不正なエラーを示す例外が発生しました。

client = Google::APIClient.new 

client.authorization.access_token = self.access_token 

plus = client.discovered_api('plus', 'v1') 

moment = { 
    :type => 'http://schemas.google.com/AddActivity', 
    :target => { :id => Time.now.to_i.to_s, 
       :description => message, 
       :name => message 
    } 
} 

# post a moment/activity to the vault/profile 
req_opts = { :api_method => plus.moments.insert, 
      :parameters => { :collection => 'vault', :userId => 'me', }, 
      :body_object => moment 
} 

response = client.execute!(req_opts).body 

私も

credentials = Hash.new 
credentials[:access_token] = self.access_token 
credentials[:refresh_token] = self.refresh_token 
credentials[:expires_at] = self.expires_at 
client.authorization.update_token!(credentials) 

しかし、運に

client.authorization.access_token = self.access_token 

を交換しようとしています。

私は問題が関係しているのどちらかだと思い

  1. OmniAuthは私が適切に

グーグル:: APIClientオブジェクトにトークンを設定しない

  • 正しくGoogleにrequest_visible_actionsを発行しません私はこれまでに以下のリソースを使っていますが、私は正式に立ち往生しています:

    任意のアイデアをいただければ幸いです!

  • +0

    私はこの同じ問題を抱えていますが、私はまだ運がありませんでした。 – cicloon

    答えて

    0

    APIコンソールで、Webアプリケーションまたはインストールされたアプリケーションとして登録しましたか? あなたのケースでは、インストールされているアプリケーションを選択する必要があると思うので、ユーザーがオンラインでない場合はトークンが有効になります。

    +0

    同じ設定でアクティビティをリストすることができるので、そのアクティビティには関係しません。 – cicloon

    3

    「google-api-client」と一緒に「omniauth-google-oauth2」を使用しているWebアプリケーションのコードです。このサンプルコードではカレンダーAPIを使用していますが、うまくいくと思います。

    require 'google/api_client' 
    
    class Calendar 
        def initialize(user) 
        @user = user 
        end 
    
        def events 
        result = api_client.execute(:api_method => calendar.events.list, 
              :parameters => {'calendarId' => 'primary'}, 
              :authorization => user_credentials) 
    
        result.data 
        end 
    
        private 
    
        def api_client 
        @client ||= begin 
         client = Google::APIClient.new(application_name: 'xxx', application_version: '0.0.1') 
         client.authorization.client_id = ENV["GOOGLE_KEY"] 
         client.authorization.client_secret = ENV["GOOGLE_SECRET"] 
         client.authorization.scope = 'https://www.googleapis.com/auth/calendar' 
         client 
        end 
        end 
    
        def calendar 
        @calendar ||= api_client.discovered_api('calendar', 'v3') 
        end 
    
        def user_credentials 
        auth = api_client.authorization.dup 
        # @user.credentials is an OmniAuth::AuthHash cerated from request.env['omniauth.auth']['credentials'] 
        auth.update_token!(access_token: @user.credentials.token) 
        auth 
        end 
    end 
    
    関連する問題