[API 写法] 基于 socialite 扩展包做的 苹果登录 (apple 登录)

  2020年4月之后,上架App Store得应用如果含有三方登录如google、微信、github等必须集成apple账号得登录,否则无法通过审核!
谁让小胳膊拧不过大腿呢。我们要上线还是的集成.

首先介绍下,本文章主要介绍纯API集成Apple登录。而且使用了socialite集成的三方登录,qq、微信已经集成对接完成。如果有需要的可以给我留言。我有时间可以把相关也贴出来。
还是很感谢socialite 非常适宜的增加了apple登录。前几天看还没有今天一刷新居然已经集成了。非常的高兴可以节省大量时间完成功能。不用重复造轮子。

一. socialite 介绍

首先贴一下socialite集成类目地址 方便大家找到使用:
socialiteproviders.netlify.app/pro...
1. composer require socialiteproviders/apple

2. config\app.php 的 \SocialiteProviders\Manager\ServiceProvider::class到中的providers[]

  'providers' => [
    // a whole bunch of providers
    // remove 'Laravel\Socialite\SocialiteServiceProvider',
    \SocialiteProviders\Manager\ServiceProvider::class, // add
];

3. 事件监听器

 将SocialiteProviders\Manager\SocialiteWasCalled事件添加到您的listen[] 数组中app/Providers/EventServiceProvider。

 将您的侦听器(即来自提供者的侦听器)添加到SocialiteProviders\Manager\SocialiteWasCalled[]刚创建的侦听器中。

  您为此提供程序添加的侦听器    为'SocialiteProviders\\Apple\\AppleExtendSocialite@handle',

如:protected $listen = [
\SocialiteProviders\Manager\SocialiteWasCalled::class => [
    // add your listeners (aka providers) here
    'SocialiteProviders\\Apple\\AppleExtendSocialite@handle',
],

];

4. 配置相关 请使用此扩展包 socialite-apple-helper
github.com/Ahilmurugesan/socialite...

***其他使用方法请看socialite 不同的我们可以继续讨论
下面说说几个常见的问题

注:

  1. 出现返回状态码 400 invalid_request 类信息。通常由于缺少参数,包含不受支持的参数,包含多个凭据或使用多种机制进行客户端身份验证而导致请求格式错误。
    可以重点看一下扩展包需要的参数是code 。入参数必须要有 。
  2. 出现状态吗400 invalid_client 为客户端认证失败。如果code正常传入对话 请主要看下 APPLE_CLIENT_SECRET 是否已经生成且生成对。
  1. 出现状态吗 400且返回报错是:invalid_grant 。出现此错误基本可以确认是前端传值错误,可以去让前端在确认下数据。这里给的排查建议是,前端获取到值后需要转string类型传给后端,这个点需要注意.
  2. 还有一种错误可能是header头里面User-Agent ,可以删除试试 。
    $request->headers->remove(‘User-Agent’);

不过官网给到两种登录方式 大家可以看看 。我这里主要是基于socialite扩展包做的纯API文档 。
纯API还有一点需要注意 使用扩展包在

$driver = Socialite::driver('apple');
//下面这个要开启不校验web的一些数据 可以看源码 ,因为我们是纯api无状态的开启方式
Socialite::with('apple')->stateless();
下面就可以获取到用户信息了
$userInfo = $driver->user();

入参:

返回值:

关于返回值中邮箱发现不对 经过查看文档大概意思是,如果用户未授权显示个人真实等信息,则苹果接口会返回一个以.appleid.com结尾的邮箱

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5
自由与温暖是遥不可及的梦想

他们 有官方中文文档么

3年前 评论

@自由与温暖是遥不可及的梦想 当时做的时候都是别人整理的零碎的文档看看。官方的就看到英文文档。developer.apple.com/documentation/...

3年前 评论

auth/token时候code怎么传递的啊,官方文档上也没看到。

3年前 评论

我是code只要前端传过来。扩展包会自动支持的。

file

3年前 评论
raybon 3年前
osang 3年前
  1. 生成Client_Secret 核心
require "jwt"

从 apple 开发者中心生成的私钥P8 文件用于拿到code 的校验码 下载到本地 此处填写下载的私钥路径

key_file = "*.p8"  

 团队ID 点击登录账户左上角主页进去看 10位字符串

team_id = "Apple Developer 的Team ID"

client_id 如果是针对 Native 授权 则填写App 对应的Bundle ID 如果你是用的web Apple 登录 则使用Apple Developer 中心的Service_ID 

client_id = "com.apple.test"Apple Developer 申请的私钥key 的ID 用于解密校验码code  10位字符串 从苹果开发者中心获取

key_id = "####"

生成JWT 的有效期

validity_period = 180 # In days. Max 180 (6 months) according to Apple docs.

private_key = OpenSSL::PKey::EC.new IO.read key_file

token = JWT.encode(
    {
        iss: team_id,
        iat: Time.now.to_i,
        exp: Time.now.to_i + 86400 * validity_period,
        aud: "https://appleid.apple.com",
        sub: client_id
    },
    private_key,
    "ES256",
    header_fields=
    {
        kid: key_id
    }
)
puts token

此脚本是在Mac 装有ruby 环境下执行:

ruby client_secret.ry

我们得到的结果就是client_secret , 放到 laravel 的env 内对应的参数上

3年前 评论
raybon (作者) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!