現状
Laravel Passportをインストールすることで
他アプリケーションから、Laravelに登録されたユーザーのアクセストークン取得、
アクセストークンからユーザ情報取得まで行なっております。
Postmanで実行するとJSONにてユーザー情報取得できました。
##構成
PHP8, MYSQL8
A : http://exampleA.com : laravel8
B : http://exampleB.com : laravel以外、CMSなど
何がしたいか
laravel Passport の公式ドキュメントなどみたのですが、認可コードからアクセストークンを取得する際、
テストコードでは事前にClient_id, Client_secret,redirect_urlを設定しておりますが、
この値はユーザー毎に変化するかと思われます。
そこで、Aにログインしているユーザ情報からClient情報(id,secret,redirect_url)を取得できればと思い、
APIにてユーザ情報を取得するAPI:getを記述し、Bから実行したのですが(既にAでログイン済)
ドメインが異なるのか、ログインユーザーの情報が取得できませんでした。
既にログインされているシステムのユーザー情報を別のドメインからアクセストークンなどを使用せずに、取得できるのでしょうか?
過去質問も一度読んでみたのですが、
- ドメインが異なる
- 既にLaravel Passport を実装している
ことからこちらの求めている質問と違うものかと感じました。
teratail:Lalavel でログインしているか外部から確認したい
##やってみたこと
-
先にAのlaravelでログインし、routes/api.php にてapiを書いてBのシステム上からAのlaravelに向けて実行してみたのですが、ログイン画面が表示されユーザー情報の取得はできませんでした。
-
将来的にサードパーティCookieは使用できなくなる可能性があるとは聞いていましたが、
Aのlaravel内にてクライアント情報のCookieを発行し、BのlaravelからCookieを取得することでアクセストークンを取得、
アクセストークンから Aのlaravelにアクセスしてユーザー情報取得はできました。
コード
A: laravelに記載
php
1//routes/api.php 2use App\Http\Controllers\AuthJudgeController; 3Route::get('/auth_client', [AuthJudgeController::class,'authJudge']);
php
1//App/Http/Controllers/AuthJudgeController :api 2<?php 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use Illuminate\Support\Facades\Auth; 7 8class AuthJudgeController extends Controller 9{ 10 public function authJudge(){ 11 if (Auth::check()) { 12 $user = Auth::user(); 13 $data = json_encode($user->name,$user->mail); 14 $json = json_decode($data, true); 15 return $json; 16 } 17 return "Error"; 18 } 19}
A:Laravel Passport使用のためapi
: driverをpassport
に変更。
php
1//config/auth.php 2'guards' => [ 3 'web' => [ 4 'driver' => 'session', 5 'provider' => 'users', 6 ], 7 8 'api' => [ 9 'driver' => 'passport', 10 'provider' => 'users', 11 ], 12],
B:クライアント 認可コードからアクセストークンを取得する
php
1<?php 2// 3require 'vendor/autoload.php'; 4use GuzzleHttp\Client as Client; 5$http = new Client; 6 7if($_GET['code']){ 8 //理想はアクセストークンを取得前にログイン中のUserIdからclient情報を取得したいが 9 //実行後にログイン画面が表示 10 //ユーザーに対して、それぞれclient_id,client_secret,redirect_uriが必要。 11 $client = $http->request('GET','http://127.0.0.1:8080/api/auth_client',[]); 12 13 //トークンエンドポイントにアクセスすることでアクセストークンを取得 14 $response = $http->post('http://127.0.0.1:8080/oauth/token',[ 15 'form_params' => [ 16 'grant_type' => 'authorization_code', 17 'client_id' => $client->id, 18 'client_secret' => $client->secret, 19 'redirect_uri' => $client->redirect, 20 'code' => $_GET['code'], 21 ], 22 ]); 23 24 $res = json_decode((string)$response->getBody(), true); 25 echo "access_token: ".$res['access_token'] ."<br>"; 26 echo "<br>認可コード:".$_GET['code']."<br><br>"; 27} 28
あなたの回答
tips
プレビュー