renepardon / lighthouse-graphql-passport-auth
通过Lighthouse使用passport添加登录和密码恢复功能的GraphQL类型和mutations
Requires
- php: >=7.2
- ext-json: *
- guzzlehttp/guzzle: ^6.5
- laravel/passport: ^8.2
- laravel/socialite: ^4.3
- nuwave/lighthouse: ^4.8
Requires (Dev)
- orchestra/testbench: ^4.0
- phpunit/phpunit: ^8.0
Suggests
- guzzlehttp/guzzle: Send PSR7 requests
- laravel/passport: Authentication the easy way with OAuth2
- laravel/socialite: Social authentication
- nuwave/lighthouse: GraphQL with laravel
README
Lighthouse版本^4.8的Laravel Passport GraphQL mutations
安装
确保您已安装Laravel Passport。
要安装,请运行composer require renepardon/lighthouse-graphql-passport-auth
。
ServiceProvider将自动附加
运行此命令以发布迁移、模式文件和配置文件
php artisan vendor:publish --provider="Renepardon\LighthouseGraphQLPassport\Providers\LighthouseGraphQLPassportServiceProvider"
将以下环境变量添加到您的.env文件中
PASSPORT_CLIENT_ID=
PASSPORT_CLIENT_SECRET=
安装完成!
配置
在配置文件中,您现在可以设置要用于导出的模式文件,如下所示
/* |-------------------------------------------------------------------------- | GraphQL schema |-------------------------------------------------------------------------- | | File path of the GraphQL schema to be used, defaults to null so it uses | the default location | */ 'schema' => base_path('graphql/auth.graphql')
这允许您在需要时更改模式和解析器。
使用方法
这将向您的GraphQL API添加8个mutations
extend type Mutation { login(input: LoginInput): AuthPayload! refreshToken(input: RefreshTokenInput): RefreshTokenPayload! logout: LogoutResponse! forgotPassword(input: ForgotPasswordInput!): ForgotPasswordResponse! updateForgottenPassword(input: NewPasswordWithCodeInput): ForgotPasswordResponse! register(input: RegisterInput @spread): AuthPayload! socialLogin(input: SocialLoginInput! @spread): AuthPayload! verifyEmail(input: VerifyEmailInput! @spread): AuthPayload! }
- 登录:允许您的客户端通过密码授权客户端登录。
- 刷新令牌:允许您的客户端使用密码授权客户端刷新护照令牌。
- 登出:允许您的客户端使护照令牌失效。
- 忘记密码:允许您的客户端请求忘记密码的电子邮件。
- 更新忘记的密码:允许您的客户端从收到的电子邮件中更新忘记的密码。
- 注册:允许您的客户端使用默认的Laravel注册字段注册新用户。
- 社交登录:允许您的客户端使用Socialite的访问令牌从社交提供商登录。
- 验证电子邮件:允许您的客户端在收到电子邮件中的令牌后验证电子邮件。
使用电子邮件验证
如果您想使用Laravel附带的功能,请按照https://laravel.net.cn/docs/6.x/verification中的说明配置模型,完成此操作后,添加以下特质
use Illuminate\Contracts\Auth\MustVerifyEmail; use Renepardon\LighthouseGraphQLPassport\HasLoggedInTokens; use Renepardon\LighthouseGraphQLPassport\MustVerifyEmailGraphQL; class User extends Authenticatable implements MustVerifyEmail { use Notifiable; use HasApiTokens; use HasSocialLogin; use MustVerifyEmailGraphQL; use HasLoggedInTokens; }
这将添加一些用于发送带令牌的电子邮件通知的方法。在以下mutation中使用令牌。
{ mutation { verifyEmail(input: { "token": "HERE_THE_TOKEN" }) { access_token refresh_token user { id name email } } } }
如果令牌有效,将颁发令牌。
使用Socialite进行社交登录
如果您想使用社交登录的mutation,请将Renepardon\LighthouseGraphQLPassport\HasSocialLogin
特质添加到您的用户模型中,如下所示
use Renepardon\LighthouseGraphQLPassport\HasSocialLogin; class User extends Authenticatable { use Notifiable; use HasApiTokens; use HasSocialLogin; }
这将添加一个由mutation使用的方法,用于从社交网络获取用户,并基于provider
和provider_id
从数据库中创建或获取它。
/** * @param Request $request * @return mixed */ public static function byOAuthToken(Request $request) { $userData = Socialite::driver($request->get('provider'))->userFromToken($request->get('token')); try { $user = static::where('provider', Str::lower($request->get('provider')))->where('provider_id', $userData->getId())->firstOrFail(); } catch (ModelNotFoundException $e) { $user = static::create([ 'name' => $userData->getName(), 'email' => $userData->getEmail(), 'provider' => $request->get('provider'), 'provider_id' => $userData->getId(), 'password' => Hash::make(Str::random(16)), 'avatar' => $userData->getAvatar() ]); } Auth::onceUsingId($user->id); return $user; }
您可以根据需要覆盖此方法并添加更多字段。
请确保Socialite已正确配置以使用社交网络,请参阅Laravel Socialite
为什么OAuth客户端在后端使用,而不是在客户端应用程序中使用?
当一个需要重新编译和重新部署到iOS应用等商店的应用程序需要更改客户端时,无论出于何种原因,都会成为QA的障碍,甚至如果客户端被删除,还会破坏生产应用程序。应用程序将在新版本带有更新密钥部署之前无法工作。有其他方法在客户端中存储此配置,但在此用例中,我们依赖于后端作为OAuth客户端。
测试
要运行此包中的测试,请导航到项目根目录并运行
composer install
然后
./vendor/bin/phpunit
贡献
有关详细信息,请参阅贡献指南。
安全
如果您发现任何安全相关的问题,请通过发送电子邮件到rene dot pardon at boonweb dot de,而不是使用问题跟踪器。
鸣谢
以及所有在提交历史中工作的开发者。
许可
MIT许可(MIT)。请参阅许可文件以获取更多信息。