Q&A

SpringSecurityでclient secretとchannel secretを同じにしてもアクセストークン発行時にエラーになる

前提・実現したいこと

WebアプリでSpringSecurityを使用してLINEログイン機能を実装しようとしています。 実装にあたり参考にしたサイトは以下になり設定値以外はほぼ同じです。

 https://qiita.com/KWS_0901/items/6a2ff2e6904ec893751c

参考サイトをもとに各種設定を行いました。 ※一部抜粋

spring.security.oauth2.client.registration.line.provider=line
spring.security.oauth2.client.registration.line.client-id=チャネルID
spring.security.oauth2.client.registration.line.client-secret=チャネルシークレット
spring.security.oauth2.client.registration.line.redirect-uri=http://localhost/login/oauth2/code/{registrationId}

また、チャネルは公開済みのうえ設定は下記のように行いました。

 チャネル基本設定   ・チャネル名:テスト   ・チャネル説明:テスト   ・アプリタイプ:ウェブアプリ   ・アサーション署名キー    ・OpenID Connect:申請済み

 LINEログイン設定   ・コールバックURL: http://localhost/login/oauth2/code/line

実現したいことはアクセストークンの発行を成功させ採取的にメールアドレスを取得することです。

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

アクセストークン発行時のレスポンスが400 (Bad Request)となりアクセストークンが取得できません。 デバッガーでコードを確認したところDefaultAuthorizationCodeTokenResponseClient#getTokenResponseで 例外がThrowされていました。

 org.springframework.security.oauth2.core.OAuth2AuthenticationException : [invalid_client] invalid client_secret

ログは以下のようになっています。

o.s.security.web.FilterChainProxy        : Securing GET /oauth2/authorization/line
o.s.s.web.DefaultRedirectStrategy        : Redirecting to https://access.line.me/oauth2/v2.1/authorize?response_type=code&client_id=チャネルID&scope=profile&state=XXXX%3D&redirect_uri=http://localhost/login/oauth2/code/line
o.a.coyote.http11.Http11InputBuffer      : Received [GET /login/oauth2/code/line?code=XXXX&state=XXXX%3D HTTP/1.1
o.a.c.authenticator.AuthenticatorBase    : Security checking request GET /login/oauth2/code/line
o.s.security.web.FilterChainProxy        : Securing GET /login/oauth2/code/line?code=XXXX&state=XXXX%3D
org.apache.tomcat.util.http.Parameters   : Start processing with input [code=XXXX&state=XXXX%3D]
o.s.web.client.RestTemplate              : HTTP POST https://api.line.me/oauth2/v2.1/token
o.s.web.client.RestTemplate              : Accept=[application/json, application/*+json]
o.s.web.client.RestTemplate              : Writing [{grant_type=[authorization_code], code=[XXXX], redirect_uri=[http://localhost/login/oauth2/code/line], client_id=[XXXX]}] as "application/x-www-form-urlencoded;charset=UTF-8"
s.n.www.protocol.http.HttpURLConnection  : sun.net.www.MessageHeader@42d0e4fc7 pairs: {POST /oauth2/v2.1/token HTTP/1.1: null}{Accept: application/json;charset=UTF-8}{Content-Type: application/x-www-form-urlencoded;charset=UTF-8}{User-Agent: Java/17.0.1}{Host: api.line.me}{Connection: keep-alive}{Content-Length: 143}
s.n.www.protocol.http.HttpURLConnection  : sun.net.www.MessageHeader@62964da310 pairs: {null: HTTP/1.1 400 Bad Request}{cache-control: no-store}{content-type: application/json;charset=UTF-8}{date: Fri, 3 Mar 2023 05:45:50 GMT}{server: Armeria/1.21.0}{x-content-type-options: nosniff}{x-frame-options: DENY}{x-line-request-id: 73139fd7dc11ba41}{x-xss-protection: 1; mode=block}{content-length: 70}
o.s.web.client.RestTemplate              : Response 400 BAD_REQUEST
.s.a.DefaultAuthenticationEventPublisher : No event was found for the exception org.springframework.security.oauth2.core.OAuth2AuthenticationException

試したこと

・GithubにあるSpringSecurityを使用したLINEログイン(サンプル的なもの)を探し設定のみ変更(同様の問題が発生) ・アサーション署名キーの削除や追加 ・チャネルシークレットの再発行 ・コールバックURLに外部公開しているテスト環境のURLを設定 ・チャネルの再作成 ・OIDCメールアドレス取得を未申請のまま ・curlコマンドでの確認  下記リンクを参考に実行   https://developers.line.biz/ja/reference/line-login/#issue-access-token

 この実行結果も400でした。認可コードは直前に取得した認可コード(10分以内)です。

 "error":"invalid_request","error_description":"Parameter conditions \"grant_type=authorization_code\" OR \"grant_type=refresh_token\" OR \"grant_type=client_credentials\" not met for actual request parameters: 'grant_type={authorization_code'}, 'code={XXXX'}, 'redirect_uri={http://localhost/login/oauth2/code/line'}, 'client_id={XXXX'}, 'client_secret={XXX}・・・

補足情報(FW/ツールのバージョンなど)

Springboot 3.0.3 SpringSecurity 6.0.2 (oauth2-clientも入っています)

皆様、どうぞよろしくお願いいたします。

  • 0
  • 2
  • 719
  • twitter facebook

シュークリーム様

ありがとうございます。 こちらのレスポンス内容はwindows版curlの出力内容のままになっております。 申し訳ございません。

実際に発行したコマンドの方が分かりやすいかと思いますので記載いたします。

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=XXXX' --data-urlencode 'redirect_uri=http://localhost/login/oauth2/code/line' -d 'client_id=XXXX' -d 'client_secret=XXXX'

どうぞよろしくお願いいたします。

  • 0

エラーコード的には grant_type の値が正しくないというふうに読めました。

ドキュメントを読むと、ここには authorization_code という固定値が入るように見えます。 そして、エラーメッセージにも authorization_code という文字が入っていますね。

ただ、markdownの問題なのか、 貼り付けていただいているエラーメッセージのクオーテーションやカッコの対応がおかしくなってるみたいなので、 どこが悪いのかぱっとわかりませんでした。

いま一度、エラーメッセージのフォーマットについてpreviewなどを用いて確認していただけると、 より回答が得られやすくなるのかなと思いました。

  • 0
本当によろしいですか? question.vm