laravel - 使用 Angular 5 和 Lumen 5.6 进行社交登录
问题描述
我正在尝试使用 angular 5 作为我的前端和 lumen 5.6 作为我的后端来实现社交登录。
我正在使用带有 Lumen 的 JWT 身份验证系统。所以,我很困惑在这种情况下我应该如何实现社交登录系统。
通过我的研究,我找到了这些可以完成这项工作的库,但我不确定从前端(角度)到后端(流明)的过程是如何处理的。
For Angular 5 -
angularx-social-login OR Satellizer
For Lumen -
laravel/socialite
但是由于我没有找到任何关于 Satellizer 使用 Angular 5 的文档,所以我选择使用其他文档。
我已经阅读了这篇文章,但是我仍然不清楚从前端到后端的过程。 https://medium.com/@barryvdh/oauth-in-javascript-apps-with-angular-and-lumen-using-satellizer-and-laravel-socialite-bb05661c0d5c
任何解释性帮助?
解决方案
所以我在 Angular 5 中使用社交登录的方式是使用一个名为
"angular5-social-login": "^1.0.9",
因此,将其添加到您的package.json
文件中。
将其导入app.module.ts
import { SocialLoginModule, AuthServiceConfig, GoogleLoginProvider, FacebookLoginProvider } from 'angular5-social-login';
在中设置函数app.module.ts
export function getAuthServiceConfigs() {
const config = new AuthServiceConfig(
[
{
id: FacebookLoginProvider.PROVIDER_ID,
provider: new FacebookLoginProvider('') // Left as i dont use it
},
{
id: GoogleLoginProvider.PROVIDER_ID,
provider: new GoogleLoginProvider('YOUR-API-TOKEN.apps.googleusercontent.com')
},
]
);
return config;
}
将其添加到您的 Imports 中app.module.ts
imports: [
HttpClientModule,
AppRoutingModule,
...
SocialLoginModule, // One we need to add
],
然后在将其添加到您的提供者中app.module.ts
providers: [
YourServices,
...
ApiAuthService,
{
provide: AuthServiceConfig,
useFactory: getAuthServiceConfigs
},
LoggedInGuard,
],
如您所见,我有一个LoggedInGuard
和一个ApiAuthService
这些是带有身份验证并检查您的登录的这些。
所以这就是安装和设置的包......
现在在里面api-auth.service.ts
添加这个功能
socialSignIn(userData) {
const formData = new FormData();
formData.append('email', userData.email);
formData.append('name', userData.name);
formData.append('provider', userData.provider);
formData.append('id', userData.id);
formData.append('idToken', userData.idToken);
formData.append('token', userData.token);
formData.append('image', userData.image);
return this._http.post(
environment.apiUrl + '/auth/social-signin/',
formData,
{
headers: new Headers({
'Authorization': 'Bearer ' + userData.idToken
})
}
);
}
现在在您的登录组件中将其添加到 HTML
<div (click)="socialSignIn('google')" class="c2a_btn large google">
Log in with google
</div>
在您的登录组件 .ts 文件中添加此功能
import { AuthService, FacebookLoginProvider, GoogleLoginProvider, LinkedinLoginProvider } from 'angular5-social-login';
import { ApiAuthService } from '../../../../services/api-auth.service';
import { TokenService } from '../../../../services/token.service';
public socialSignIn(socialPlatform: string) {
this.loading = true;
let socialPlatformProvider;
if (socialPlatform === 'facebook') {
socialPlatformProvider = FacebookLoginProvider.PROVIDER_ID;
} else if (socialPlatform === 'google') {
socialPlatformProvider = GoogleLoginProvider.PROVIDER_ID;
} else if (socialPlatform === 'linkedin') {
socialPlatformProvider = LinkedinLoginProvider.PROVIDER_ID;
}
this.socialAuthService.signIn(socialPlatformProvider).then(
(userData) => {
this._apiAuthService.socialSignIn(userData)
.map( data => {
return data.json();
})
.subscribe(
token => {
this._tokenService.setAccessToken(token.access_token);
},
error => {
this.invalidLogin = true;
this.loading = false;
},
() => {
this.loading = false;
this.closeSignIn.emit('out');
// this._router.navigate(['/profile']);
}
);
}
);
}
这只是后端的前端。我正在使用 Laravel 5.6
但我做了一个这样的功能
public function socialSignIn(Request $request, Response $response) {
$date = date('Y-m-d h:i:s');
$provider = $request->input('provider');
if ($provider == 'google') {
$id_token = $request->header('Authorization');
$id_token = str_replace("Bearer ","",$id_token);
$CLIENT_ID = Config::get('google.client_id');
$email = $request->input('email');
$names = $request->input('name');
$name = explode(' ', $names);
$client = new \Google_Client();
$client->setDeveloperKey($CLIENT_ID);
$payload = $client->verifyIdToken($id_token);
if ($payload) {
if (User::where('email', '=', $email)->exists()) {
$user = User::Where('email', '=', $email)->first();
if(!Auth::loginUsingId($user->id)){
return response()->json([
'failed'
], 403);
}
$updateLastLoginDate = User::where('id', Auth::user()->id)-first();
$updateLastLoginDate->last_login_date = $date;
$updateLastLoginDate->save();
$activeAccount = Auth::user();
$activeAccount->active = '1';
$activeAccount->save();
} else {
$recordUser = New User;
$recordUser->email = $request->input('email');
$recordUser->last_login_date = $date;
$recordUser->save();
$recordLinkedSocialAcounts = new LSA;
$recordLinkedSocialAcounts->user_id = $recordUser->id;
$recordLinkedSocialAcounts->provider_name = $provider;
$recordLinkedSocialAcounts->provider_id = $request->input('id');
$recordLinkedSocialAcounts->save();
$recordUserInformation = new UPI;
$recordUserInformation->user_id = $recordUser->id;
$recordUserInformation->first_name = $name[0];
$recordUserInformation->last_name = $name[1];
$recordUserInformation->last_login_date = $date;
$recordUserInformation->image = $request->input('image');
$recordUserInformation->save();
if(!Auth::loginUsingId($recordUser->id)){
return response()->json([
'failed'
], 403);
}
}
return response()->json([
'access_token' => Auth::user()->createToken('access_token')->accessToken,
'role_id' => Auth::user()->role_id
], 200);
} else {
return response()->json([
'failed'
], 403);
}
}
}
我很可能很快就会制作一个视频。任何问题只要问
推荐阅读
- android - Android SAF 写的文件有原版的尾巴
- kotlin - ktor 无法访问 IntelliJ 中的类
- generics - 将 Rust 特征对象与泛型方法一起使用
- c# - 渲染包含 Razor 代码的字符串模板
- python - 如何拆分文本文件中的文本块并将其保存到对象或列表中?
- javascript - 用于闭环的javascript
- android - 如何使 EditText 可以处理 14 KB 文本 (Kotlin)
- php - laravel voyager 只是保持加载并且不起作用
- c# - ItextSharp 不使用 c# 维护 pdf 中的列宽
- ruby-on-rails - 在其他控制器中使用设计时没有响应