我正在设置一个Laravel应用程序来通过Google进行身份验证.
我被提示选择一个Google帐户并允许访问我的Google信息,我已经完成了回调功能.
当我的回调函数运行时(它被正确调用)我得到:
我的AuthController中导致错误的代码是:
$user = \Socialite::driver('google')->user();
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何帮助.我正在使用Laravel 5.1和Socialite 2.0.
我已经按照http://laravel.com/docs/5.1/authentication中的所有步骤在Laravel 5.1上使用facebook进行社交登录.
这是我遵循的步骤:
1 - 使用Laravel根项目中的命令:
composer require laravel/socialite
Run Code Online (Sandbox Code Playgroud)
2 - 在config/app.php配置文件中注册Laravel\Socialite\SocialiteServiceProvider:
'providers' => [
// Other service providers...
Laravel\Socialite\SocialiteServiceProvider::class,
],
Run Code Online (Sandbox Code Playgroud)
3 - 将Socialite外观添加到应用程序配置文件中的别名数组:
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
Run Code Online (Sandbox Code Playgroud)
4 - 在config/services.php中添加facebook服务:
'facebook' => [
'client_id' => env('FACEBOOK_CLIENT_ID'),
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
'redirect' => 'http://homestead.app/auth/facebook/callback',
],
Run Code Online (Sandbox Code Playgroud)
5 - 向我的AuthController.php添加方法redirectToProvider()和handleProviderCallback():
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Socialite;
class AuthController extends Controller
{
/*
|--------------------------------------------------------------------------
| Registration & Login Controller
|--------------------------------------------------------------------------
|
| This controller …Run Code Online (Sandbox Code Playgroud) 我使用Laravel 5.2和Socialite.我能够提取出用户的详细信息,但问题是如果我将头像注入其中,则无法正确显示头像src.
社交网站返回一个对象,我可以使用它$facebookDetails->getAvatar()返回一个像这样的值https://graph.facebook.com/v2.6/123456789/picture?type=normal
如果我在图像中回显此值src,它将看起来像这样.
<img src="https://graph.facebook.com/v2.6/123456789/picture?type=normal" />
这似乎不是图像的实际URL,因为当我在浏览器上输入它时,它会将我重定向到"实际"图像并显示图像.
如何在img标签上显示图像以显示实际图像?
我正在处理的应用程序具有邮寄功能。当我在登录后一个多小时尝试发送邮件时,我遇到了错误。访问令牌已过期,迫使您重新登录。
但是如何刷新访问令牌?我知道我首先必须检查令牌是否已过期,然后使用刷新令牌发送请求,最后保存返回的访问令牌。
我现在已经创建了一个中间件并将其应用于 web.php 中的路由,如下所示:
Route::get('create', 'EmployeeController@create')
->middleware('refresh');
Run Code Online (Sandbox Code Playgroud)
然后在中间件中我有以下代码:
public function handle($request, Closure $next)
{
dump(session('user'));
$client = new Google_Client();
$client->setAccessToken(['access_token' => session('user')->token, 'expires_in' => session('user')->expiresIn]);
$_SESSION['token'] = $client->getAccessToken();
$client->setAccessToken($_SESSION['token']);
if( $client->isAccessTokenExpired() ) {
echo "expired";
}
else {
echo "not expired";
}
return $next($request);
}
Run Code Online (Sandbox Code Playgroud)
我知道这甚至没有做任何接近我想要的事情。但是当我登录时,它似乎总是回显“过期”,即使我刚刚登录。我想那是因为我没有指定到期日期,但我不知道如何设置一个看起来像社交名流的人只支持这些基本的职能:
$token = $user->token;
$refreshToken = $user->refreshToken; // not always provided
$expiresIn = $user->expiresIn;
Run Code Online (Sandbox Code Playgroud)
我能找到的最接近我的问题的问题是:如何使用 Laravel 管理 OAuth 刷新令牌? 这告诉我添加离线访问权限,如下所示:
return Socialite::driver('google')->scopes([ 'email', 'profile', 'https://www.googleapis.com/auth/gmail.compose' ])
->with(["access_type" => "offline", "prompt" => "consent select_account"]) …Run Code Online (Sandbox Code Playgroud) 是否可以在运行时更改 config/services.php 中设置的redirect_uri 值?
我尝试这样做:
返回 $socialite->driver('facebook')->redirectUrl(newUrl)->redirect();
但它会抛出一个错误,指出redirect_uri 应与 OAuth 对话框中的一致。进一步检查错误消息后,redirect_uri 的值为空,因此显然,redirectUrl() 方法不起作用。
附:
这是我使用的在composer.json 中定义的社交名流版本:
“laravel/社交名流”:“^2.0”
在access_token由社会名流收购(通过Socialite::driver(self::PROVIDER)->user()具有有限的时间有效性。对于谷歌这是一个小时。
我可以refresh_token通过将重定向调用更改为:
Socialite::driver(self::PROVIDER)->stateless()->with([
'access_type' => 'offline',
])->redirect()
Run Code Online (Sandbox Code Playgroud)
一个小时内,我可以access_token通过调用读取用户数据
// $token = read_stored_access_token()
\Socialite::driver(self::PROVIDER)->userFromToken($accessToken);
Run Code Online (Sandbox Code Playgroud)
一小时后,当令牌失效时,Google API 开始返回401 Unauthorized,Socialize 将其传播出去:
(1/1) ClientException
Client error: `GET https://www.googleapis.com/plus/v1/people/me?prettyPrint=false` resulted in a `401 Unauthorized` response:
{"error":{"errors":[{"domain":"global","reason":"authError","message":"Invalid Credentials","locationType":"header","loc (truncated...)
Run Code Online (Sandbox Code Playgroud)
现在有了refresh_token,我应该可以轻松刷新了access_token。但是我在 Socialize 文档或源代码中找不到允许我这样做的提及。
真的是唯一的方法来完成这个使用谷歌的 API 库并手动执行此操作吗?它不会扼杀使用 Socialize 的整个想法吗?
注意:我试图避免redirect()再次拨打电话,因为这可能会迫使用户每小时选择一个他的 Google 帐户,这很烦人。
谢谢!
我正在尝试使用 Postman 通过 Twitter 进行概念验证社交登录流程,遵循本指南: https: //developer.twitter.com/en/docs/twitter-for-websites/log-in-with- twitter/guides/implementing-sign-in-with-twitter
我陷入了步骤 3:将请求令牌转换为访问令牌
我正在使用 Postman 内置的 OAuth 1.0 授权,并为我的消费者密钥、消费者秘密、访问令牌和令牌秘密提供了值。
无论我尝试什么,我的回复POST都是:https://api.twitter.com/oauth/access_token401
Request token missing
Run Code Online (Sandbox Code Playgroud)
我将oauth_verifier第 2 步中的数据作为x-www-form-urlencoded数据包含在内。
我的项目是使用 Laravel 和 Socialite 开发的。我也尝试过在类getTokenCredentials上使用该方法League\OAuth1\Client\Server\Server并得到相同的Request token missing错误。
我的最终目标是使用userFromTokenAndSecretTwitter Socialite 驱动程序提供的方法来检索用户配置文件数据。
以前有人遇到过这个错误吗?
我使用 Passport 将用户登录到 Laravel API 端点,用户使用 laravel-socialite 包使用其社交帐户(google、facebook)进行身份验证。
用户登录和注销的工作流程完美运行(生成令牌......等等)。问题是我有一个控制器,它应该根据是否有用户登录返回数据。
我确实从 HTTP 请求中拦截了 Bearer 令牌,但我无法让用户使用该令牌(我会使用数据库外观来根据令牌选择用户,但我实际上正在寻找是否已经实现了更干净的方法护照)
我也不想使用 auth:api 中间件,因为即使没有用户登录,控制器也应该工作并返回数据。
这是api路由:
Route::get("/articles/{tag?}", "ArticleController@get_tagged");
Run Code Online (Sandbox Code Playgroud)
这是我希望控制器具有的逻辑
public function get_tagged($tag = "", Request $request)
{
if ($request->header("Authorization"))
// return data related to the user
else
// return general data
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 Laravel Framework 5.6 版实现在线预订系统并Laravel Socialite实现 gmail 登录。
我有一个方法可以在预订之前检查用户是否登录,或者通过 redis 和 cookie 放置reserveData并redirectUrl指定uniqid以在登录后获取它:
public function checkAuthentication(Request $request)\n{\n $reserveData = json_decode($request->input(\'reserveData\'), true);\n Session::put(\'reserveData\', $reserveData);\n\n if (!Auth::check()) {\n $reserveID = uniqid();\n Cookie::queue(Cookie::forget(\'reserveID\'));\n Cookie::queue(Cookie::make(\'reserveID\', $reserveID, 1440));\n\n $stepData = [\n \'redirectUrl\' => route(\'reserve\', [\'productId\' => $reserveData[\'productId\']]),\n \'reserveData\' => $reserveData\n ];\n\n Redis::set($reserveID, serialize($stepData));\n\n return redirect()->route(\'redirectToGmail\');\n }\n\n return redirect()->route(\'reserve\', [\'productId\' => $reserveData[\'productId\']]);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n重定向到Gmail:
\n\npublic function redirectToGmail()\n{\n return Socialite::driver(\'google\')->redirect();\n}\nRun Code Online (Sandbox Code Playgroud)\n\n问题是,仅在用户第一次尝试登录时uniqid从 …
我已经使用 Laravel 5.4 和 socialite 3.0 在我的 Web 应用程序上进行社交登录。但是现在我收到一个错误Legacy People API has not been used in project xxx。然后我对socialite package的一个核心文件做了一些修改。/vendor/laravel/socialite/src/Two/GoogleProvider.php 第 61 行:替换https://www.googleapis.com/plus/v1/people/me?通过https://www.googleapis.com/oauth2/v3/userinfo?
并使用以下代码更新 mapUserToObject 函数:
protected function mapUserToObject(array $user)
{
$user['id'] = Arr::get($user, 'sub');
$user['verified_email'] = Arr::get($user, 'email_verified');
$user['link'] = Arr::get($user, 'profile');
return (new User)->setRaw($user)->map([
'id' => Arr::get($user, 'sub'),
'nickname' => Arr::get($user, 'nickname'),
'name' => Arr::get($user, 'name'),
'email' => Arr::get($user, 'email'),
'avatar' => $avatarUrl = Arr::get($user, 'picture'),
'avatar_original' => $avatarUrl,
]);
}
Run Code Online (Sandbox Code Playgroud) laravel ×9
php ×6
access-token ×1
cookies ×1
facebook ×1
laravel-5 ×1
laravel-5.1 ×1
postman ×1
twitter ×1