やっぱりLineLoginを使って認証するように仕様変更だ!

http://localhost7/curl.phpやっぱりなんちゃってOAuth2を使うのはやめてLineLoginを使うことにしたよ!

なんだかんだでLineのグルがきっかけでこのツールの作成を思い立ったしね!
スマホ持っててLineやってない人はいないだろうし、やってないならフレポ集めとかしないだろうし!

そんなわけでLineLoginについて勉強だ!

OAuth2は認可の仕組み OAuth connectはOAuth2+認証の仕組み
そしてLineLoginはOAuth2とOAuth connectの両対応、という事らしい。
心配しないで!僕もよく分かってない!(心配

まずはLine側でデベロッパー登録だ!
https://developers.line.me/ja/docs/line-login/getting-started/
↑ここを見ながらやってみてください(適当
多分これより丁寧にはかけません。

Channelの作成時、作成後の設定について。
僕はアプリタイプは両方にチェックを付けました。
Webもネイティブも作る予定なので。

今日の目標

・LineLoginからIDトークンを取得する

前提

・Webアプリケーション用のサーバが準備済みで、ちゃんとWebでアクセスできる
  (僕の場合は http://hoshidora.game.chiekougou)
・LineLoginのチャンネルが作成済み
  (この記事の冒頭部分を参考にしてください)
・今回のディレクトリ構成は
 ┳index.php
 ┗getToken.php
2ファイルのみだ!単純だね!
え?slim3で構築するんじゃないの?って?
まぁ、今回は動作検証目的だし!

1. やりたいことを具体的に整理してみよう

一言でアクセストークンをとってくる、と言っても
じゃあ、具体的にどうすれば?
となると思うので、整理します。

1.http://hoshidora.games.chiekougou にアクセスがあった場合に

//2. 有効なIDトークンを持っていなければ

3. https://access.line.me/oauth2/v2.1/authorize にリダイレクトさせて

4. 3.の入力後に http://hoshidora.games.chiekougou/getToken.php にリダイレクトしてもらい

5. 4.のURIについてた認証コードをもとに webアプリケーションサーバが lineに IDトークンをもらい

6. とりあえずIDトークンを画面に表示できたら完成!

まぁ、6はどうかと思いますがw
あくまでテストなので。
さらにテストなので2の作業も飛ばします。

2. Lineログインのチャンネル設定をして、必要な情報の確認をするよ!

Channel基本設定から
ChannelID と ChannelSecret をコピーしてどっかに保存しておく。>後で使う
アプリタイプにWEB が入ってるのを確認する
アプリ設定から
Callback URL の設定を行う
(僕の場合は http://hoshidora.games.chiekoubou/getToken.php)

3. LineLoginへリダイレクトさせるURIを作成するよ!

https://developers.line.me/ja/docs/line-login/web/integrate-line-login/
↑とりあえずマニュアルはちゃんと読みましょうという事で
ここの「認可を要求する」を読みながら作業します。

ざっくりいうとこんな感じですよね

https://access.line.me/oauth2/v2.1/authorize
?response_type=code
&client_id=
&redirect_uri=
&state=
&nonce=
&scope=openid profile

は2.でメモしたcliend_idを
は2.で設定したcallbackURLを設定
については、XSRFに対するセキュリティ確保のため
ランダムな文字列を設定してリダイレクトで帰ってきた時に照合するために設定するみたい。
ここで説明してもわかりにくいので、実際にテストしながら説明しようかと!(あってるかどうかは謎
についてはリプレイアタックに対するセキュリティ確保のため
やっぱりランダムな文字列を設定するらしい。
これもテストの中で僕の知ってる範囲で解説します。(あってるかどうかは謎

以上を踏まえてテスト用のリンクを作成するページを作るとこんな感じか

index.php

";
	$redirectUri="";
	$state=sha1(md5(uniqid(openssl_random_pseudo_bytes(256), true)));
	$nonce=sha1(md5(uniqid(openssl_random_pseudo_bytes(256), true)));
	$_SESSION['state']=$state;
	$_SESSION['nonce']=$nonce;
	
	$url = "$lineLoginUrl".
		"?response_type=code".
		"&client_id=$clientId".
		"&redirect_uri=$redirectUri".
		"&state=$state".
		"&nonce=$nonce".
		"&scope=openid profile";
?>


	login test [link]

	LineLogin

↑の login test をクリックするとLineLoginの画面に飛んで、
ID,Passを入れると /getToken.phpにリダイレクトされて戻ってくると思う。
でも、またgetToken.phpは作ってないからNotfoundとかになるかな?
まぁ、アドレスバーになんか出てくればここまでは十分成功と言えると思います。

4. 認可コードからIDトークンを取得だ!

3.でもらったのは認可コードであって、アクセストークンとかIDトークンではないので注意が必要だ!
認可コードを使ってIDトークンをゲットするぞ!

getToken.php

';
	$clientId='';
	$clientSecret='';

	$p = $_GET;

	$data=[
		'grant_type'=>'authorization_code',
		'code'=>$p['code'],
		'redirect_uri'=>$redirectUrl,
		'client_id'=>$clientId,
		'client_secret'=>$clientSecret,
	];
	$data = http_build_query($data, "", "&");

	$header = array(
			"Content-Type: application/x-www-form-urlencoded",
			"Content-Length: ".strlen($data),
	);
	
	$curlOpt=array(
		CURLOPT_URL => $url,
		CURLOPT_RETURNTRANSFER => true,  //結果を文字列で受け取る
		CURLOPT_HTTPHEADER => $header ,
		CURLOPT_POST => 1,
		CURLOPT_POSTFIELDS => $data,
	);
	
	$ch = curl_init();
	curl_setopt_array($ch, $curlOpt);
	
	
//	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // サーバ証明書検証をスキップ
//	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // サーバ証明書検証をスキップ
	
	//DEBUG
	//curl_setopt($ch, CURLOPT_HEADER, true);
	//curl_setopt($ch, CURLOPT_VERBOSE, true);

	$rs= curl_exec($ch);
	$info = curl_getinfo($ch);
	$errno = curl_errno($ch);
	$error = curl_error($ch);

	curl_close($ch);

	print "info:
"; print_r($info); print "
"; if($errno){ print("errorNo:$errno.
$error"); }else{ $rs = json_decode($rs); print "response:
"; print_r($rs); } ?>

errorNo:~
って出てきてたら、curlでの接続が失敗してます。
サーバ証明書検証をスキップしたらうまくいくかもだけど、テストの時だけにしてね!

response:~
って出てきたら、通信自体は成功した感じです。
その中でerrorが出てれば値の設定が何かおかしいかったりするので、
何で怒られてるのかをじっくり考えましょう。
responseに id_tokenとかaccess_tokenとかが含まれてれば、取得に成功してます。
あとは煮るなり焼くなり好きにしましょう。

僕は疲れたのでいったん冷蔵庫に入れて寝ようかと思います。

今日はこの辺で!

←よかったらクリックお願いします。

kataware の紹介

二児の父、職業SE、やりたいことはゲームと歌とアプリ作ったりサーバいじったり娘の服を作ったり色々あり過ぎて時間が足りなさ過ぎて病みそうだから娘に癒してもらってる。
カテゴリー: SE備忘録, ソシャゲ支援ツール開発記   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です