やりたいこと
こちらの公式ドキュメントにある通り、JWTをsalesforceへ送り、アクセストークンを取得したいです。
やったこと
やったことは、
①RSAのprivate-key を発行し、証明書を作成。
②証明書をsalesforceのアプリケーションに保存。
③手元のコードでJWTを作成し、salesforceへ送信する(レスポンスがエラーを返すので、正しく渡せていません。)
試したコードはこちらです。
ruby
1require 'jwt' 2require 'json' 3require 'net/http' 4require 'uri' 5require 'active_support/all' 6require "base64" 7 8class Salesforce 9 def initialize 10 @cert_file = File.join(File.dirname(__FILE__), *%w[private-key.pem]) 11 @base_url = "https://login.salesforce.com" 12 @auth_endpoint = "/services/oauth2/authorize" 13 @token_request_endpoint = "/services/oauth2/token" 14 @token_revoke_endpoint = "/services/oauth2/revoke" 15 @username = "私のアカウント" 16 @client_id = "私のコンシューマID" 17 @private_key = OpenSSL::PKey::RSA.new(File.read(@cert_file)) 18 end 19 20 21 def claim_set 22 { 23 iss: @client_id, 24 sub: @username, 25 aud: @base_url, 26 exp: (Time.now + 3.minutes).to_i.to_s 27 } 28 end 29 30 def jwt_bearer_token 31 token = JWT.encode(claim_set.to_s.gsub(/\/) { '' }, @private_key, 'RS256') 32 # token.encode(Encoding::UTF_8) 33 end 34 35 def request_auth 36 post = {grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer", assertion: jwt_bearer_token} 37 uri = URI.parse("#{@base_url}#{@token_request_endpoint}") 38 https = Net::HTTP.new(uri.host, 443) 39 https.use_ssl = true 40 response = https.post(uri.path, post.to_query) 41 print response.body 42 end 43 44 print Salesforce.new.request_auth 45 print Salesforce.new.jwt_bearer_token 46 47end
わかっていること
jwt.ioのdebuggerでjwt_bearer_tokenを確認すると、
header には
{ "alg": "RS256" }
payload には
"{:iss=>\"私のコンシューマID\", :sub=>\"私のアカウント\", :aud=>\"https://login.salesforce.com\", :exp=>\"1624593277\"}"
と表示されており、内容に問題はなさそうです。(若干気になるのは、""このバックスラッシュが入っている点です。
salesforceに詳しい方がいらっしゃればお答えいただけるととてもありがたいです。
試せるものは試したいと思っています。
よろしくお願いします。
あなたの回答
tips
プレビュー