2

ユーザーのサインイン/アップに Google SSO を使用する Rails アプリがあります。Safari では問題なく動作しますが、Chrome では次のエラーが発生し続けます。

Blocked a frame with origin "[domain]" from accessing a frame with origin "https://accounts.google.com". Protocols, domains, and ports must match.

以前にこの「ソリューション」を使用して解決しました: https://github.com/zquestz/omniauth-google-oauth2/issues/122#issuecomment-60510241

しかし、最近、代わりに上記のソリューションを使用すると、Safariで突然機能しなくなったことに気付きました。

私の現在の実装は次のようになります(コーヒースクリプト):

$(document).ready ->
  $.ajax
    url: 'https://apis.google.com/js/client:plus.js?onload=gpAsyncInit'
    dataType: 'script'
    cache: false

window.gpAsyncInit = ->

  $('.googleplus-login').click (e) ->
  e.preventDefault()

  gapi.auth.authorize {
    immediate: false
    response_type: 'code'
    cookie_policy: 'single_host_origin'
    client_id: '[id]'
    scope: 'email profile'
  }, (response) ->
    if response and !response.error
      # google authentication succeed, now post data to server and handle data  securely
      jQuery.ajax
        type: 'POST'
        url: '/auth/google_oauth2/callback'
        dataType: 'json'
        data: response
        success: (json) ->
          # response from server
          [this doesn't happen]

          return
    else
      # google authentication failed

このエラーは Google のドキュメントのどこにも記載されていないので、修正方法がよくわかりません。

私は同じプロトコルを持っていると確信しているhttpsので、別のものでなければなりません。私はドメインを推測しています。

他のサイト (Stack-overflow など) では、ポップアップが表示されず、代わりにユーザーが別のページにリダイレクトされる別のフローが使用されていることがわかりました。それが解決策(および/または)エラーを回避するための推奨される方法であるかどうか疑問に思います。

その場合、Google のドキュメント ジャングルのどこでこれに関するドキュメントを見つけることができますか?

アップデート

これは、私のコントローラー コードの関連部分です。

def google_authentication

  respond_to do |format|

    code = params[:code]

    unless code.blank?

      [..]

      load = { code: code, client_id: client_id, client_secret: client_secret, grant_type: grant_type, redirect_uri: redirect_uri }
      url = "https://www.googleapis.com/oauth2/v3/token/"
      response = HTTParty.post(url, :query => load, headers: { "content-type" => "application/x-www-form-urlencoded"})
      json = JSON.parse(response.body)

      unless json.nil?

        unless json["error"].present?

          [..]

          email = decoded_hash["email"]
          user = User.find_by_email(email)

          if user
            sign_in_existing_user(user)
            format.json { render :json => {:status => "Success", user_id: "# {user.id}"} }
          else
            # Create user
            [..]
            format.html { redirect_to current_user, notice: "Welcome #{current_user.name}!" }
            format.json { render :json => {:status => "Success", user_id: "#{current_user.id}"} }

          end
        else
          #format.html { redirect_to root_path, error: "Could not sign up / in" }
          format.json { head :no_content }
        end
      end
    end
  end
end

@EugZol による以下の回答に基づいて、JS を次のように更新しました。

data: {access_token: response['access_token'], error: response['error'], expires_in: response['expires_in']}

そして、現在次のエラーが発生しています。

Started POST "/auth/google_oauth2/callback" [..]
Processing by UsersController#google_authentication as JSON
Parameters: {"expires_in"=>"86400", "provider"=>"google_oauth2"}
Completed 406 Not Acceptable in 1ms (ActiveRecord: 0.0ms)

ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/users_controller.rb:237:in `google_authentication'
4

1 に答える 1