61567


WEBアプリのLINEログインでトークンを取得するとこで`{"error":"invalid_grant","error_description":"redirect_uri
does not match"}`というエラーでトークンの取得に失敗します。

Rails5+devise+omniauth-
lineで試してますが、多分その辺の問題は余り関係無いような気がしています。ローカルで試しているのでngrokを使って試しています。

LINE側のログイン画面は下記のようなURLで表示させています。`client_id`は念のため伏せます。チャンネルIDを指定しています。

[code]

    https://access.line.me/oauth2/v2.1/authorize?client_id=****&redirect_uri=https%3A%2F%2Fdd7c0812.ngrok.io%2Fusers%2Fauth%2Fline%2Fcallback&response_type=code&scope=profile+openid&state=79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e
    
[/code]

これでログイン画面は問題なく表示され「ログイン」ボタンを押すと、下記のURLに戻ってきます。これは私のローカルのWEBアプリです。

[code]

    https://dd7c0812.ngrok.io/users/auth/line/callback?code=ZdpeKTHQMr3FLBCKnImK&state=79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e
    
[/code]

ここで`https://api.line.me/oauth2/v2.1/token`にポストすると`{"error":"invalid_grant","error_description":"redirect_uri
does not match"}`のレスポンスが帰ってきてトークンの取得が出来ません。

ポスト内容はこんな感じです（同じくシークレットはふせます）。

[code]

    https://api.line.me/oauth2/v2.1/token
    Content-Type: application/x-www-form-urlencoded
    client_id=***
    client_secret=***
    code=ZdpeKTHQMr3FLBCKnImK
    grant_type=authorization_code
    redirect_uri=https%3A%2F%2Fdd7c0812.ngrok.io%2Fusers%2Fauth%2Fline%2Fcallback%3Fcode%3DZdpeKTHQMr3FLBCKnImK%26state%3D79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e
    
[/code]

実際には`omniauth-
line`が全部組み立ててるのでミスは無いと思うのですが失敗してしまうので、何か管理画面側の設定かなと思っています。関係あるか分からないけど試したのは、チャンネルを公開にしてみたのと、ログインを試してるLINEアカウントをチェンネルの権限設定でTesterに登録しました。

LINEのサポートにも問い合わせましたが、散々またされたあげくに、

> 大変申し訳ございませんが、ドキュメント内設定などの技術的なサポートは個別返信を行っておりません。  
>  不明点などは、LINE Developers ページ内の「FAQ」や「Community」をご参照ください。

とのつれない返事が・・・コミュニティーも見たけどそれっぽい物は有りません。何か思い当たることがある方いらっしゃいますでしょうか？

* * *

2019/12/24追記

いただいた回答でファイナルアンサーなのですが、その後ライブラリの中身を追って、何故この問題が起きたのか、どう解決すれば良いのかまとめましたので同じ問題ではまってる人いたら参考にしてください。

<https://qiita.com/MasamotoMiyata/items/ccc932e96a4f5dd6c2e1>


CC BY-SA 4.0
2019-12-19T03:26:53.883
61565
2020-05-17T22:15:54.977
2019-12-24T06:57:04.167
15048
15048
question
ruby-on-rails oauth devise line
WEBのLINEログインで"redirect_uri does not match"


トークンエンドポイント（<https://api.line.me/oauth2/v2.1/token>）に送信しているリクエストの`redirect_uri`が正しくない（不要な`code`と`state`パラメーターを付加している）ことが原因です。

エラーは、

> "redirect_uri does not match"

なので、トークンリクエストのクエリーストリングで指定した`redirect_uri`（リダイレクトURI：ユーザーがログインした後のリダイレクト先）が、LINE（＝OAuth
2.0の認可サーバー）の管理コンソールで設定したものと完全に一致していないはずです。

**[参考] LINE Developers ドキュメント**  
<https://developers.line.biz/ja/docs/line-login/web/integrate-line-login/>

最初に認可エンドポイント（<https://access.line.me/oauth2/v2.1/authorize>）にリクエストを送信したときは、以下のように正常なURI（＝LINE側に登録されている「Callback
URL」と一致しているURL）なので成功しますが、

>
> redirect_uri=https%3A%2F%2Fdd7c0812.ngrok.io%2Fusers%2Fauth%2Fline%2Fcallback

次にトークンエンドポイント（<https://api.line.me/oauth2/v2.1/token>）にリクエストを送信したときは、以下のように不正なURL（一致しないURL）なので失敗します。

>
> redirect_uri=https%3A%2F%2Fdd7c0812.ngrok.io%2Fusers%2Fauth%2Fline%2Fcallback%3Fcode%3DZdpeKTHQMr3FLBCKnImK%26state%3D79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e

このURLは、URLデコードすると分かりますが、最初のリクエストで指定したURLにLINEで発行された認可コード（`code`）と`state`パラメーターが付加されているので、これを含めないでPOSTする必要があります。

>
> ?code=ZdpeKTHQMr3FLBCKnImK&state=79baaf82c0c5c1f564fe21ecb2b69722f939c8f010da527e

**[補足]**

仕様については、[「The OAuth 2.0 Authorization Protocol - 4.1.3.
アクセストークンリクエスト」](https://openid-foundation-japan.github.io/draft-ietf-
oauth-v2-draft22.ja.html#anchor27)に書いてあります。

> redirect_uri  
>  Section 4.1.1 で示す認可リクエストに, redirect_uri パラメーターが含まれていた場合は必須 (REQUIRED).
> その値をそのまま付与しなくてはいけない (MUST).


CC BY-SA 4.0
2019-12-19T05:47:58.940
61567
2019-12-19T06:18:12.943
2019-12-19T06:18:12.943
21092
21092
61565
answer


自分もこれで4時間もどハマリした…。時間を返してくれ。

登録している「コールバックURL」じゃなく、ログイン画面へのリンク時に指定した「redirect_uri」と完全一致しないといけない。つまり、「?」以降のパラメータまでしっかり一緒じゃないといけない。

てか、エラー内容をもっと詳しく吐き出せといいたい。「最初のredirect_uriにパラメータを指定している場合はそれも含める必要がある」の一行くらい書けんのか…。

というか、パラメータくらい省略してもいいだろ。許せよ、そのくらい。codeなんてすぐ期限切れるんだし、パラメータの省略を許したからってセキュリティに問題ができるとは到底思えん。

そういう気遣いの無いところが発展途上すぎて、この先も仕様が変わる事が心配で導入するのを躊躇してしまう。


CC BY-SA 4.0
2020-05-17T22:15:54.977
66732
2020-05-17T22:15:54.977
40199
61565
answer