3x1io / laravel-sign-in-with-apple
轻松将苹果的新单点登录功能添加到您的网站。
资助包维护!
mikebronner
Requires
- php: ^8.1
- laravel/socialite: ^5.6
Requires (Dev)
- orchestra/testbench: ^8.0
- orchestra/testbench-browser-kit: ^7.12
- orchestra/testbench-dusk: ^7.20
- phpunit/phpunit: ^9.5.10
- predis/predis: ^2.1
Suggests
- genealabs/laravel-socialiter: Automatic user resolution and persistence for any Laravel Socialite driver.
This package is auto-updated.
Last update: 2024-09-04 14:01:31 UTC
README
支持此包
这是一个MIT许可的开源项目,其持续发展得益于社区的资助。如果您想支持它以及我们的其他包,请考虑通过上面的按钮资助我们。
我们感谢以下赞助商的慷慨,请花点时间了解他们
目录
需求
- PHP 7.3+
- Laravel 8.0+
- Socialite 5.0+
- 苹果开发者订阅
安装
-
安装composer包
composer require genealabs/laravel-sign-in-with-apple
我们还推荐使用geneaLabs/laravel-socialiter来自动管理用户解析和持久化
composer require genealabs/laravel-socialiter
配置
-
为您的网站创建一个
App ID
(https://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"
-
为您的网站创建一个
Service ID
(https://developer.apple.com/account/resources/identifiers/list/serviceId),以下为详细信息- 描述:(例如"example.com service id")
- 标识符:com.example.service(或类似)
- 选择"Sign In With Apple"
- 配置"Sign In With Apple"
- 主要App ID:(选择在第1步中创建的主要App ID)
- Web域名:example.com(您的网站域名)
- 返回URL:https://example.com/apple-signin(指向控制器中回调方法的路由)
- 点击"保存"。
- 点击"编辑"按钮以编辑我们刚才创建的"Sign In With Apple"配置的详细信息。
- 如果您尚未验证域名,请下载验证文件,将其上传到https://example.com/.well-known/apple-developer-domain-association.txt,然后点击"验证"按钮。
-
为您的网站创建一个
私钥
(https://developer.apple.com/account/resources/authkeys/list),以下为详细信息- 密钥名称
- 选择"Sign In With Apple"
- 配置"Sign In With Apple"
- 主要App ID:(选择在第1步中创建的主要App ID)
- 点击"保存"
- 点击"继续"
- 点击"注册"
- 点击"下载"
- 将下载的文件重命名为
key.txt
-
创建您的应用程序客户端密钥
-
安装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.servicekey_id
:这是上面第3步中创建的私钥的标识符。
-
保存文件并从终端运行它。它将输出JWT,这是您的客户端密钥,您需要在下一个步骤将其添加到
.env
文件中。ruby client_secret.rb
-
-
在您的
.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。
致谢
- https://developer.okta.com/blog/2019/06/04/what-the-heck-is-sign-in-with-apple
- 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
。(不必担心,因为它是一个开发依赖,它不会安装在你的生产环境中。)