Я использую Laravel Passport для обработки моей реализации входа в систему oauth2. Следуя видео от Dre Himself . Все работает нормально, когда на локальном хосте, но возникли проблемы с входом в реальный сайт, теперь я хочу развернуть свое приложение в DigitalOcean, и после настройки nginx, файла .env, composer, npm, паспорта настройки (php паспорт ремесленника: установить) и базу данных с помощью (php миграция ремесленника). Кажется, все работает нормально, пока мой логин не вернул 200 с полезной нагрузкой ответа
<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\n <title>Resume Workshop</title>\n\n <!-- Fonts -->\n <link href=\"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700;900&display=swap\" rel=\"stylesheet\"> \n <link rel=\"stylesheet\" href=\"https://myresumeworkshop.com/css/app.css\">\n </head>\n <body>\n <main id=\"app\"></main>\n <script src=\"https://myresumeworkshop.com/js/app.js\"></script>\n </body>\n</html>\n
Вместо правильного ответа токен доступа носителя. Забавно то, что когда я использую бессонницу для отправки почтового запроса к конечной точке / oauth / token, он возвращает токен, и я могу вручную вставить токен в свое локальное хранилище, и приложение будет работать совершенно нормально.
Вот мой код входа на сервер:
public function login(Request $request) {
$http = new \GuzzleHttp\Client;
try {
$response = $http->post(config('services.passport.login_endpoint'), [
'form_params' => [
'grant_type' => 'password',
'client_id' => config('services.passport.client_id'),
'client_secret' => config('services.passport.client_secret'),
'username' => $request->username,
'password' => $request->password,
]
]);
// return json_decode((string) $response->getBody(), true)
return $response->getBody();
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
if ($e->getCode() === 400) {
return response()->json('Incorrect username or password', $e->getCode());
} else if ($e->getCode() === 401) {
return response()->json('Your credentials are incorrect. Please try again', $e->getCode());
}
return response()->json('Something went wrong on the server.', $e->getCode());
}
}
и мой код на стороне внешнего интерфейса:
retrieveToken(context, data) {
return new Promise((resolve, reject) => {
axios
.post("/login", {
username: data.username,
password: data.password
})
.then(response => {
const token = response.data.access_token;
localStorage.setItem("access_token", token);
context.commit('retrieveToken', token);
resolve(response);
}).catch(error => {
// console.log(error)
reject(error)
});
})
}
Когда я console.log response.data, он выведет! doctype html как выше. Я подозреваю, что это может быть связано с типом содержимого заголовка клиента Guzzle: text / html вместо application / json. Или это могло быть из-за моей nginx config.
Вот объявление ie и дамп ответа $ из запроса на публикацию guzzle
GuzzleHttp\Psr7\Response {#334
-reasonPhrase: "OK"
-statusCode: 200
-headers: array:6 [
"Server" => array:1 [
0 => "nginx/1.14.0 (Ubuntu)"
]
"Content-Type" => array:1 [
0 => "text/html; charset=UTF-8"
]
"Connection" => array:1 [
0 => "close"
]
"Cache-Control" => array:1 [
0 => "no-cache, private"
]
"Date" => array:1 [
0 => "Sat, 01 Aug 2020 22:45:37 GMT"
]
"Set-Cookie" => array:3 [
0 => "XSRF-TOKEN=eyJpdiI6IlNlWWU4NzA2Q0ZLcFdQeWR0dHlra2c9PSIsInZhbHVlIjoiNTZWSlRmUk80UzViV2FXSVFPRGlmTHdGXC9kVmNxRG1oRHNwcllyNHhqOXNOZk0zTloxYlZ3bkwrbG03eTF1SkUiLCJtYWMiOiIyOTIyZWY5ODMyNTNiMDc5Y2JiOTI4ZDEwYjM0YTczYzcxNzgyZWJiYTA1NjM2YzM3MTBhN2U1MTEwZWE5ZjM5In0%3D; expires=Sun, 02-Aug-2020 00:45:37 GMT; Max-Age=7200; path=/"
1 => "resume_workshop_session=eyJpdiI6InlkWTlHWnBqVXZnOFwvRndUOGduQWV3PT0iLCJ2YWx1ZSI6IlRpaXlaTmJzZUl2MlVvRlBFakhVK0FIeDV3K0xXMnlVWmpVUTNjWDBHbFJ1UkNVbWZQSTVxcXg3RHNvZUF0NXYiLCJtYWMiOiJlNTI2YjQyNjRjMGZhODNhNjhkNjdhOWQ1MzQ5YWY2MmNlZTAwODk3M2NiYmI5YTJiNDQxMDUxNWQ3NzNiZmY3In0%3D; expires=Sun, 02-Aug-2020 00:45:37 GMT; Max-Age=7200; path=/; httponly"
2 => "LfsxdWN0U7YDplqYkRiAHeaRYayLUBKvUToCvfV3=eyJpdiI6IkdEU1NVVnk5VE9ESzNvNjNGTTYwdUE9PSIsInZhbHVlIjoidEZ3WjR5dDdSR0Zya1Z5UkpnVk5JU3FVWWJCczhXOHkxd0dud0FpVDhkK29cL2NKemNZNTAwS1N6alpxSm0yNU13bGRFREhRS3BnSWd6RDZFc05MNXJsN3FFWktNTjBzcjkyVHVHS1hNN0NuZEZvZFZVak85SUQrRWRPaFRQK3BtYTc1YU4wOHlVbmlkdnNrWGVYcUhQcmRPbjExXC8rUldyTFwvMFwvVUltaGk3QzZcL1d0RVA1SVFIbzgxVmZVSjE5SnFJazZqd1d4Z000QjB4MWxLVThJd1FYQjN2QTlCeGp3WjZIRlpFd0VHU3ZcL3p3N2lsRXdOOGhuXC9iUWJMd3Nmb0FwaENIOW1qTVU5dWJWZkVTXC9oeXoxRUpTODRxT3hmcExoWW85cG9DOGFGaDNyUmxRdDJGYlpBbkNpZXNSbGNIYlNZbTN4REhjREkrV0doK0c5Vk1kWW82RERCN1NDRlhWcFBLVU5tWDdXdGM9IiwibWFjIjoiMmRhYzlhZGVhZWIwMGVmZDdiYTJiNWUwYTAwNDQ0MTgxMTY1ZDY2MmU5MWE0MWE5ODA5ZGJlNWIyYjE2NzY5MSJ9; expires=Sun, 02-Aug-2020 00:45:37 GMT; Max-Age=7200; path=/; httponly"
]
]
-headerNames: array:6 [
"server" => "Server"
"content-type" => "Content-Type"
"connection" => "Connection"
"cache-control" => "Cache-Control"
"date" => "Date"
"set-cookie" => "Set-Cookie"
]
-protocol: "1.1"
-stream: GuzzleHttp\Psr7\Stream {#333
-stream: stream resource @26
wrapper_type: "PHP"
stream_type: "TEMP"
mode: "w+b"
unread_bytes: 0
seekable: true
uri: "php://temp"
options: []
}
-size: null
-seekable: true
-readable: true
-writable: true
-uri: "php://temp"
-customMetadata: []
}
}