解決したいこと
Youtube Data APIを利用し、アクセストークンを取得することができた。
取得したアクセストークンでAPIをコールしたところ、以下のようなエラーが出た。
様々な手法を試したが、解決できないため先人の知恵を借りたい。
bash
1Sending HTTP get https://www.googleapis.com/youtube/v3/subscriptions?mine=true&part=snippet 2Caught error SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate in certificate chain) 3Error - #<OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate in certificate chain)> 4Completed 500 Internal Server Error in 478679ms (ActiveRecord: 0.0ms | Allocations: 36133) 5OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate in certificate chain)):
現在わかっていること
取得したアクセストークンを利用し、curlコマンドを実行するとAPIからデータが返却される。
bash
1curl "https://www.googleapis.com/youtube/v3/subscriptions?mine=true&part=snippet&access_token=access_token"
試したこと
- SSL証明書が、存在すること
OpenSSL::SSL::SSLError
というエラー内容からSSL証明書が存在しないと推測した。
参照するSSL証明書のPATHを確認するため、$ ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"
を実行すると、$HOME/.rbenv/versions/2.6.6/openssl/ssl/cert.pem
という結果が得られた。
cat $HOME/.rbenv/versions/2.6.6/openssl/ssl/cert.pem
を実行し、SSL証明書が存在することがわかった。
実際のコード
ruby
1require 'google/apis/youtube_v3' 2require 'google/api_client/client_secrets' 3 4class Channel::EnrollController < ApplicationController 5 def index 6 scope = Google::Apis::YoutubeV3::AUTH_YOUTUBE 7 redirect_url = "#{channel_enroll_url}/oauth2callback" 8 9 auth_client = authorize_client 10 auth_client.update!( 11 scope: scope, 12 redirect_url: redirect_url 13 ) 14 auth_uri = auth_client.authorization_uri.to_s 15 redirect_to auth_uri 16 end 17 18 def create 19 authorization = Signet::OAuth2::Client.new( 20 access_token: session[:access_token] 21 ) 22 23 youtube_subscription = Google::Apis::YoutubeV3::YouTubeService.new 24 youtube_subscription.authorization = authorization 25 26 youtube_subscription.list_subscriptions("snippet", mine: true) ## ここで、エラーになる 27 end 28 29 def oauth2callback 30 auth_client = authorize_client 31 auth_client.code = request['code'] 32 auth_client.fetch_access_token! 33 auth_client.client_secret = nil 34 session[:access_token] = JSON.parse(auth_client.to_json)["access_token"] 35 redirect_to channel_enroll_create_url 36 end 37 38 private 39 40 def authorize_client 41 file_path = "config/google_secret/client_secret.json" 42 client_secrets = Google::APIClient::ClientSecrets.load(file_path) 43 client_secrets.to_authorization 44 end 45end
あなたの回答
tips
プレビュー