Q&A

アクセストークンを発行できない

前提・実現したいこと

LINEログインの実装で、アクセストークンの取得(発行)がしたいです。 Ruby on Railsで実装しています。

発生している問題・エラーメッセージ

アクセストークン発行するためのリクエストでエラーが発生しています。

エラーコード: 400 エラーメッセージ: {"error"=>"invalid_grant", "error_description"=>"invalid authorization code"}

該当のソースコード

authorization_code = params["code"]
params = {
	"grant_type" => "authorization_code",
	"code" => authorization_code,
	"redirect_uri" => ENV['LINE_LOGIN_CALLBACK_URL']},
	"client_id" => ENV['LINE_LOGIN_CHANNEL_ID']},
	"client_secret" => ENV['LINE_LOGIN_CHANNEL_SECRET']}
}
uri = URI.parse("https://api.line.me/oauth2/v2.1/token")
response = Net::HTTP.post_form(uri, params)
response_body = JSON.parse(response.body)

試したこと

  • 環境変数(LINE_LOGIN_CHANNEL_ID, LINE_LOGIN_CHANNEL_SECRET)に余計なスペースが入っていないか、redirect_uriが間違っていないか、何度も確認しました。
  • 開発環境、本番環境ではエラーが発生しますが、何故かステージング環境ではアクセストークンを取得できます。
  • 環境変数のオーバーライドはありません。
  • 0
  • 4
  • 2286
  • twitter facebook

こんにちは

たとえば、以下のようなcurlコマンドで {"error":"invalid_grant","error_description":"invalid authorization code"} が返されます。正しいcode(authorization code)を指定しているか確認してみていただけますか?

curl -v -X POST https://api.line.me/oauth2/v2.1/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=authorization_code' \
-d 'code=適当なコード' \
-d 'redirect_uri=正しいredirect_uri' \
-d 'client_id=正しいチャネルID' \
-d 'client_secret=正しいチャネルシークレット'
  • 0

@Yazaki 様

ご回答ありがとうございます。 ログインユーザーが認証した後にパラメータとしてstateと併せて送信されてくるcodeの値を指定しています。

  • 0

不思議ですねぇ。

認可コードの使用方法について再確認するくらいでしょうか。

有効期間10分以内にアクセストークンを発行しているか(していると思いますが)と、利用回数(実は2回アクセストークンを発行しようとしていて1回目は破棄されていたり…?。これもなさそうですが)を確認する感じでしょうか。。

https://developers.line.biz/ja/docs/line-login/integrate-line-login/#receiving-the-authorization-code

アクセストークンの取得に使用される認可コード。有効期間は10分です。また、認可コードは1回のみ利用可能です。

いったんお使いのソースコードを使ってcodeを取得するだけにして、アクセストークンの発行は、別途、curlコマンドを使って試してみると、ある程度の切り分けができるかもしれません。

  • 0

私も質問者さまと同じ状態です。 curlコマンド試してみたのですが、結果は同じでした。

何かほかに考えられる原因はございますでしょうか? ちなみに環境は以下です。 docker rails6 ssl対応済(https://localhost:3001/)

以下は、curlの返答です。 `* Trying 203.104.153.64...

  • TCP_NODELAY set
  • Expire in 200 ms for 4 (transfer 0x564fb0710f50)
  • Connected to api.line.me (203.104.153.64) port 443 (#1)
  • ALPN, offering h2
  • ALPN, offering http/1.1
  • successfully set certificate verify locations:
  • CAfile: none CApath: /etc/ssl/certs
  • TLSv1.3 (OUT), TLS handshake, Client hello (1):
  • TLSv1.3 (IN), TLS handshake, Server hello (2):
  • TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
  • TLSv1.3 (IN), TLS handshake, Certificate (11):
  • TLSv1.3 (IN), TLS handshake, CERT verify (15):
  • TLSv1.3 (IN), TLS handshake, Finished (20):
  • TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
  • TLSv1.3 (OUT), TLS handshake, Finished (20):
  • SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
  • ALPN, server accepted to use h2
  • Server certificate:
  • subject: C=JP; ST=Tokyo-to; L=Shinjuku-ku; O=LINE Corporation; CN=*.line.me
  • start date: Jun 17 06:01:58 2020 GMT
  • expire date: Sep 5 12:00:00 2022 GMT
  • subjectAltName: host "api.line.me" matched cert's "*.line.me"
  • issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018
  • SSL certificate verify ok.
  • Using HTTP2, server supports multi-use
  • Connection state changed (HTTP/2 confirmed)
  • Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
  • Using Stream ID: 1 (easy handle 0x564fb0710f50)

POST /oauth2/v2.1/token HTTP/2 Host: api.line.me User-Agent: curl/7.64.0 Accept: / Content-Type: application/x-www-form-urlencoded Content-Length: 184

  • We are completely uploaded and fine
  • TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
  • TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
  • old SSL session ID is stale, removing
  • Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 400 < server: openresty < date: Tue, 27 Apr 2021 00:59:21 GMT < content-type: application/json;charset=UTF-8 < content-length: 74 < cache-control: no-store < x-content-type-options: nosniff < x-frame-options: DENY < x-xss-protection: 1; mode=block <
  • Connection #1 to host api.line.me left intact {"error":"invalid_grant","error_description":"invalid authorization code"}`
  • 0
Are you sure? question.vm