teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

質問内容が曖昧だったので詳細を追記。

2021/09/06 04:53

投稿

naUc
naUc

スコア36

title CHANGED
@@ -1,1 +1,1 @@
1
- 外部から Laravelにアクセスしてログインユーザーの情報を取得したい
1
+ Laravel Passportを使用してログインユーザーの情報を取得したい
body CHANGED
@@ -1,37 +1,40 @@
1
- ## 前提・実したいこと
1
+ ## 現
2
+ Laravel Passportをインストールすることで
2
- ドメインが異なるアプリケーションからAPIを実行することでLaravelに登録されているユーザー情報を取得できないか?と
3
+ アプリケーションからLaravelに登録されユーザーのアクセストークン取得
3
- 考えたのすが、実現方法を教えください
4
+ アクセストークンからユーザ情報取得ま行なっおります
5
+ Postmanで実行するとJSONにてユーザー情報取得できました。
4
6
 
5
- 構成
7
+ ##構成
6
8
  PHP8, MYSQL8
7
9
  A : http://exampleA.com : laravel8
8
10
  B : http://exampleB.com : laravel以外、CMSなど
9
11
 
10
- 上記の構成です、BのドメインからAPI実行によりユーザーデータ取得は可能なのでょう
12
+ ## 何がしたい
11
- (実際は、ログインされたユーザーIdなどを元に別テブルから情報を取得することが目的です。)
13
+ laravel Passport 公式ドキュメントなどみたのですが、認可コからアクセストークンを取得する際、
14
+ テストコードでは事前にClient_id, Client_secret,redirect_urlを設定しておりますが、
12
- どういった知識、理解が必要なのかご教授お願いいたします。
15
+ 値はユーザー毎に変化すると思われます。
13
16
 
17
+ そこで、Aにログインしているユーザ情報からClient情報(id,secret,redirect_url)を取得できればと思い、
18
+ APIにてユーザ情報を取得するAPI:getを記述し、Bから実行したのですが(既にAでログイン済)
19
+ ドメインが異なるのか、ログインユーザーの情報が取得できませんでした。
20
+
21
+ 既にログインされているシステムのユーザー情報を別のドメインからアクセストークンなどを使用せずに、取得できるのでしょうか?
22
+
14
23
  過去質問も一度読んでみたのですが、
15
24
  - ドメインが異なる
16
25
  - 既にLaravel Passport を実装している
17
-
18
26
  ことからこちらの求めている質問と違うものかと感じました。
19
27
  [teratail:Lalavel でログインしているか外部から確認したい](https://teratail.com/questions/97773)
20
28
 
21
- ## 現状
22
- Laravel Passportをインストールすることで
23
- 他アプリケーションからのLaravelに登録されたユーザー情報を取得する
24
- アクセストークン取得まで行なっております。
25
- Postmanで実行するとJSONにてユーザー情報取得も可能です。
26
-
27
29
  ##やってみたこと
28
- 1. 先にlaravelでログインし、routes/api.php にてapiを書いてBのシステムから実行してみたのですが、
30
+ 1. 先にAのlaravelでログインし、routes/api.php にてapiを書いてBのシステムからAのlaravelに向けて実行してみたのですが、ログイン画面が表示されユーザー情報の取得はできませんでした。
29
- ログイン画面が表示されユーザー情報の取得はできませんでした。
30
31
 
31
32
  2. 将来的にサードパーティCookieは使用できなくなる可能性があるとは聞いていましたが、
33
+ Aのlaravel内にてクライアント情報のCookieを発行し、BのlaravelからCookieを取得することでアクセストークンを取得、
32
- laravelてCookieを発行し情報取得はできました。
34
+ アクセストークンから Aのlaravelにアクセスてユーザー情報取得はできました。
33
35
 
34
36
  ## コード
37
+ A: laravelに記載
35
38
  ``` php
36
39
  //routes/api.php
37
40
  use App\Http\Controllers\AuthJudgeController;
@@ -59,7 +62,7 @@
59
62
  }
60
63
  }
61
64
  ```
62
- Laravel Passport使用のため`api` : driverを`passport`に変更。
65
+ A:Laravel Passport使用のため`api` : driverを`passport`に変更。
63
66
  ``` php
64
67
  //config/auth.php
65
68
  'guards' => [
@@ -73,4 +76,36 @@
73
76
  'provider' => 'users',
74
77
  ],
75
78
  ],
79
+ ```
80
+
81
+ B:クライアント 認可コードからアクセストークンを取得する
82
+ ``` php
83
+ <?php
84
+ //
85
+ require 'vendor/autoload.php';
86
+ use GuzzleHttp\Client as Client;
87
+ $http = new Client;
88
+
89
+ if($_GET['code']){
90
+ //理想はアクセストークンを取得前にログイン中のUserIdからclient情報を取得したいが
91
+ //実行後にログイン画面が表示
92
+ //ユーザーに対して、それぞれclient_id,client_secret,redirect_uriが必要。
93
+ $client = $http->request('GET','http://127.0.0.1:8080/api/auth_client',[]);
94
+
95
+ //トークンエンドポイントにアクセスすることでアクセストークンを取得
96
+ $response = $http->post('http://127.0.0.1:8080/oauth/token',[
97
+ 'form_params' => [
98
+ 'grant_type' => 'authorization_code',
99
+ 'client_id' => $client->id,
100
+ 'client_secret' => $client->secret,
101
+ 'redirect_uri' => $client->redirect,
102
+ 'code' => $_GET['code'],
103
+ ],
104
+ ]);
105
+
106
+ $res = json_decode((string)$response->getBody(), true);
107
+ echo "access_token: ".$res['access_token'] ."<br>";
108
+ echo "<br>認可コード:".$_GET['code']."<br><br>";
109
+ }
110
+
76
111
  ```