3x1io/laravel-sign-in-with-apple

轻松将苹果的新单点登录功能添加到您的网站。

v1.0.0 2023-03-12 12:37 UTC

This package is auto-updated.

Last update: 2024-09-04 14:01:31 UTC


README

repository-open-graph-template

支持此包

这是一个MIT许可的开源项目,其持续发展得益于社区的资助。如果您想支持它以及我们的其他包,请考虑通过上面的按钮资助我们。

我们感谢以下赞助商的慷慨,请花点时间了解他们

目录

需求

  • PHP 7.3+
  • Laravel 8.0+
  • Socialite 5.0+
  • 苹果开发者订阅

安装

siwa-video-cover

  1. 安装composer包

    composer require genealabs/laravel-sign-in-with-apple

    我们还推荐使用geneaLabs/laravel-socialiter来自动管理用户解析和持久化

    composer require genealabs/laravel-socialiter

配置

  1. 为您的网站创建一个App IDhttps://developer.apple.com/account/resources/identifiers/list/bundleId),以下为详细信息

    • 平台:iOS、tvOS、watchOS(不确定这两个选项对Web应用是否有影响)
    • 描述:(例如"example.com app id")
    • Bundle ID(明确):com.example.id(或类似)
    • 选择"Sign In With Apple"
  2. 为您的网站创建一个Service IDhttps://developer.apple.com/account/resources/identifiers/list/serviceId),以下为详细信息

    • 描述:(例如"example.com service id")
    • 标识符:com.example.service(或类似)
    • 选择"Sign In With Apple"
    • 配置"Sign In With Apple"
  3. 为您的网站创建一个私钥https://developer.apple.com/account/resources/authkeys/list),以下为详细信息

    • 密钥名称
    • 选择"Sign In With Apple"
    • 配置"Sign In With Apple"
      • 主要App ID:(选择在第1步中创建的主要App ID)
      • 点击"保存"
    • 点击"继续"
    • 点击"注册"
    • 点击"下载"
    • 将下载的文件重命名为key.txt
  4. 创建您的应用程序客户端密钥

    • 安装JWT Gem

      sudo gem install jwt
    • 创建一个名为client_secret.rb的文件来处理私钥

      require 'jwt'
      
      key_file = 'key.txt'
      team_id = ''
      client_id = ''
      key_id = ''
      
      ecdsa_key = OpenSSL::PKey::EC.new IO.read key_file
      
      headers = {
      'kid' => key_id
      }
      
      claims = {
          'iss' => team_id,
          'iat' => Time.now.to_i,
          'exp' => Time.now.to_i + 86400*180,
          'aud' => 'https://appleid.apple.com',
          'sub' => client_id,
      }
      
      token = JWT.encode claims, ecdsa_key, 'ES256', headers
      
      puts token
    • 填写以下字段

      • team_id:这可以在登录到您的苹果开发者账户时在右上角找到,位于您的名字下面。
      • client_id:这是上面第2步中创建的服务ID的标识符,例如com.example.service
      • key_id:这是上面第3步中创建的私钥的标识符。
    • 保存文件并从终端运行它。它将输出JWT,这是您的客户端密钥,您需要在下一个步骤将其添加到.env文件中。

      ruby client_secret.rb
  5. 在您的.env文件中设置必要的环境变量

    SIGN_IN_WITH_APPLE_LOGIN="/apple/login/controller/login/action"
    SIGN_IN_WITH_APPLE_REDIRECT="/apple/login/controller/callback/action"
    SIGN_IN_WITH_APPLE_CLIENT_ID="your app's service id as registered with Apple"
    SIGN_IN_WITH_APPLE_CLIENT_SECRET="your app's client secret as calculated in step 4"

实现

按钮

将以下blade指令添加到您的登录页面

@signInWithApple($color, $hasBorder, $type, $borderRadius)

控制器

此实现使用Socialite来获取登录凭证。以下是一个控制器实现的示例:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use GeneaLabs\LaravelSocialiter\Facades\Socialiter;
use Laravel\Socialite\Facades\Socialite;

class AppleSigninController extends Controller
{
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function login()
    {
        return Socialite::driver("sign-in-with-apple")
            ->scopes(["name", "email"])
            ->redirect();
    }

    public function callback(Request $request)
    {
        // get abstract user object, not persisted
        $user = Socialite::driver("sign-in-with-apple")
            ->user();
        
        // or use Socialiter to automatically manage user resolution and persistence
        $user = Socialiter::driver("sign-in-with-apple")
            ->login();
    }
}

注意,在处理返回的$user对象时,必须知道sub元素是用户的唯一标识符,而不是电子邮件地址。有关更多详情,请访问https://developer.apple.com/documentation/signinwithapplerestapi/authenticating_users_with_sign_in_with_apple

致谢

  1. https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple
  2. https://developer.apple.com/sign-in-with-apple/get-started

对质量的承诺

在包的开发过程中,我尽可能地采用良好的设计和开发实践,以确保这个包尽可能好。我的包开发清单包括

  • ✅ 尽可能地使用单元测试实现接近100%的代码覆盖率。
  • ✅ 消除SensioLabs Insight和Scrutinizer识别出的问题。
  • ✅ 完全符合PSR1、PSR2和PSR4规范。
  • ✅ 在README.md中包含全面的文档。
  • ✅ 提供一个符合http://keepachangelog.com格式的最新CHANGELOG.md。
  • ✅ 在所有代码中没有任何PHPMD或PHPCS警告。

贡献

请遵守并尊重包含的行为准则

报告问题

在报告问题时,请尽可能完整地填写包含的模板。信息不完整的问题可能会被忽略或关闭,因为没有足够的信息可以采取行动。

提交Pull Requests

请查看贡献指南。只有符合所有标准的PR才会被接受。

如果你喜欢开源软件,请给使用的仓库打⭐️。

我们已包含出色的symfony/thanks composer包作为开发依赖。通过给你的OS包维护者打⭐️,让他们知道你感激他们。安装此包后,简单地运行composer thanks。(不必担心,因为它是一个开发依赖,它不会安装在你的生产环境中。)