LoginSignup
8
4

More than 3 years have passed since last update.

SalesForceのWebサーバOAuth認証でアクセストークンをゲットしたい

Last updated at Posted at 2019-08-08

前提

  • 基本的にこの公式ドキュメントの通りにやっていきます。
  • 本番はセキュアなサーバ上でホストされているアプリケーションでなければいけません。(httpsでなければいけない)
  • sandboxでやっております。
  • 今回は開発環境でアクセストークンをとりあえずゲットするところまでやります。
  • SalesForce初心者がなんとなく認証の仕様が掴めるくらいまでを目指した記事です。
  • SalesForceをこないだ知ったばかりの人間が無茶をして書いております。詳しい人逆に教えてください。

最終的には何がしたいの?

とあるWEBサービスのプロダクトにSalesForce(以下SF)のアカウントを連携させて、SFに登録されている情報を取得してこっちでも使いたい。
例えばQiitaでTwitterを使ってログインすると、Twitterのプロフィール画像が勝手に使われますよね。
あんな感じのことがしたい。

どうやんの?

まず、情報を取得すること自体はSalesForceがAPIを用意してくれていますので簡単です。
RESTとかSOAPとか種類も豊富です。
しかし、APIを使うためには認証が必要で、その中でもREST APIを使用するための認証がOAuthなので今回はそれを攻略していきます。

まずOAuthってなに?

この記事が一番わかりやすいです。
https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be

よし!なにからやる??

この公式ドキュメントの通りに接続アプリケーションを定義してみましょう。
これは何をしているのかというと、SF側に今回連携させたいアプリを登録しているだけです。
SF側からしてもどこの誰ともわからないアプリにアクセストークンは渡せないわけです。ちゃんと定義しましょう。

注:コールバックURLはhttps://localhost とかで定義しておいても問題ないです。

できたよ!

そうすると「コンシューマの秘密」と「コンシューマの鍵」が発行・表示されますね。
これとコールバックURLを控えておきます。
なんかファンシーな響きですが機密情報なので漏らさないようにしましょう。

いよいよcurlコマンドの出番だ!

と思いきや最初はGETリクエストなので

https://test.salesforce.com/services/oauth2/authorize?response_type=code&client_id=[コンシューマ鍵]&redirect_uri=[コールバックURL]

注:今回はテストなのでhttps://test.salesforce.com になっていますが、本番ではhttps://login.salesforce.com のエントリポイントを使います

ブラウザからここにアクセスします。
コンシューマ鍵、コールバックURLは先ほど定義したものを使用してください。

初回はSF側の認証画面が表示されますのでそのまま認証をすすめてください。

認証が済むとリダイレクトされますが、リダイレクトされたページのURL末尾に

?code=aWekysIEeqM9PiT2hEfm0Cnr6MoLIfwWyRJcqOqHdF8f9INokharAS09ia7UNP6RiVScerfhc4w%3D%3D

的な文字列がついてるのがわかると思います。

「これがアクセストークン!」と思いきや、これはアクセストークンを取得するためのcodeです。
これも控えておきましょう。

今度こそcurlコマンドだ!

さぁみなさんお待ちかねcurlコマンドです!

と思いきや僕はcurlを使うことをやめたのでコマンド自体はここでは割愛します。
(僕はこれ使ってます。最高)

やることとしては

https://test.salesforce.com/services/oauth2/token

にPOST送信でリクエストを飛ばします。
その際、公式だとわかりづらく書いてあるのですが、リクエストヘッダーではなく、ボディに全てのパラメータを詰め込みます

以下、ボディ。

grant_type=authorization_code
&code=[さっき取得したcode]
&client_id=[コンシューマ鍵]
&client_secret=[コンシューマの秘密]
&redirect_uri=[コールバックURL]

そして、公式だと多分書いてないのですが

Content-Type:application/x-www-form-urlencoded

リクエストヘッダーにつけないとgrant_typeのエラーが出ます。。(これで死ぬほど時間を食った。)

参照:https://stackoverflow.com/questions/10890467/how-can-i-use-the-grant-type-password-oauth-flow-with-salesforce-com

すると

{
    "access_token": "hgoehogehohgoehogheohgoeh",
    "signature": "nsjlfnbljdgnslbnlsfgjnbjlnfglsb",
    "scope": "full",
    "id_token": "nfdksnvlnfsglbvnlsnblknfgls",
    "instance_url": "https://hogehoge.my.salesforce.com",
    "id": "https://test.salesforce.com/id/ghoeghoehoge",
    "token_type": "Bearer",
    "issued_at": "12345677777788"
}

こんな感じのレスポンスボディが得られます。

やりました!アクセストークンをゲットですね!

追記

一度発行されたcodeは一回アクセストークンを発行すると無効になる。

最後に

あの子の心のアクセストークンもゲットしたいですね。

はい?

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4