renepardon/lighthouse-graphql-passport-auth

通过Lighthouse使用passport添加登录和密码恢复功能的GraphQL类型和mutations

4.0.0 2020-01-29 20:48 UTC

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使用的方法,用于从社交网络获取用户,并基于providerprovider_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)。请参阅许可文件以获取更多信息。