PHP 实现 apple 苹果快捷登录

2023-11-06

实现原理:

1、安装外部库php-jwt,在项目的composer.json 同级目录下运行

composer require firebase/php-jwt

执行失败的话可借鉴本文:https://blog.csdn.net/qq_24909089/article/details/106055699

2、

<?php
/**
 * 苹果验证类
 * Date: 2019/9/11
 */

use Firebase\JWT\JWK;
use Firebase\JWT\JWT;

const AUTH_KEYS_URL = 'https://appleid.apple.com/auth/keys'; //获取Apple公钥访问地址

class Vendor_Interface_Apple
{

    /**
     * 验证token是否正常
     * 验证准确性:通过Apple公钥在线(https://8gwifi.org/jwkconvertfunctions.jsp)得到用于解密的pem公钥字符串
     * @param string $identityToken 前端获取的token
     * @return bool|object
     * @throws \Firebase\JWT\InvalidArgumentException
     */
    public function apple_jwt_verify($identityToken = '')
    {
        if(!$identityToken){
            return false;
        }
        //取得下标值
        $subscript = 0;

        //获取apple认证秘钥 :https://appleid.apple.com/auth/keys
        $public_key = $this->curl_request(AUTH_KEYS_URL);

        if ($public_key['code'] != 200) {
            return false;
        }

        $alg = $public_key['data']['keys'][$subscript]['alg'];
        $kid = $public_key['data']['keys'][$subscript]['kid'];

        //获取公钥
        $pem = JWK::parseKeySet($public_key['data']);

        //返回包含密钥详情的数组
        $publicKey = openssl_pkey_get_details($pem[$kid]);

//        print_r($publicKey);
//        exit;

        $decoded = JWT::decode($identityToken, $publicKey['key'], [$alg]);
        return $decoded;
    }

    /**
     * curl请求
     * @param $url
     * @param string $type
     * @param string $post_data
     * @return array
     */
    public function curl_request($url, $type = 'GET', $post_data = '')
    {

        $curl    = curl_init();
        $aHeader = Array();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);

        if ($type == 'POST') {
            $aHeader[] = 'Content-type: application/json';
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
        }
        if (!empty($aHeader)) {
            curl_setopt($curl, CURLOPT_HTTPHEADER, $aHeader);
        }

        curl_setopt($curl, CURLOPT_TIMEOUT, 120);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $result    = curl_exec($curl);
        $info      = curl_getinfo($curl);
        $error_no  = curl_errno($curl);
        $error_str = curl_error($curl);

        curl_close($curl);
        $result_array = json_decode($result, true);

        if ($info["http_code"] == 200) {
            $data = array(
                "code" => $info["http_code"],
                "data" => $result_array
            );
        } else {
            $data = array(
                "code" => $info["http_code"],
                "data" => Array(
                    'time'      => date('Y-m-d H:i:s', time()),
                    'type'      => $type,
                    'url'       => $url,
                    'post_data' => $post_data,
                    'code'      => $info["http_code"],
                    'body'      => $result_array,
                    'error_no'  => $error_no,
                    'error_str' => $error_str
                )
            );
        }

        return $data;
    }

}

苹果官网文档:https://developer.apple.com/documentation/sign_in_with_apple/generate_and_validate_tokens

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 实现 apple 苹果快捷登录 的相关文章

随机推荐

  • gauge自动化框架踩坑(五):关于表格

    官方文档使用表格的方式有两种 1 表格参数 2 动态参数 现针对不同的情况做一分析 一 表格参数 官方文档的解释是 表格参数被用来作为一个step 执行多条数据 以官网的模板项目为例 这里给了一个表格 作为一个step Almost all
  • 将时间序列转成图像——马尔可夫转移场方法 Matlab实现

    目录 1 方法 2 Matlab代码实现 3 结果 若觉文章质量良好且有用 请别忘了点赞收藏加关注 这将是我继续分享的动力 万分感谢 其他 1 时间序列转二维图像方法及其应用研究综述 vm 1215的博客 CSDN博客 2 将时间序列转成图
  • BOOST升压电路PCB布局布线

    一 正确找出BOOST的高频电流环路 尽可能让di dt大的路径小 在boost中为开关管 二极管 与输出电容 二 输入环路 先经过Cin再到芯片输入脚 三 输出环路 重要 SW覆盖面积要小 四 反馈环路 重要 与FB相连的两个电阻越靠近F
  • 零拷贝内存 & 固定内存

    一 总览 虚拟内存是一种计算机内存管理的技术 它让程序认为程序自身有一段完整的连续可用的内存 一个地址空间 当程序运行时所占的内存空间大于物理空间容量 操作系统可以将暂时不用的数据放入到磁盘 用的时候再拿出来 这样磁盘有一部分空间就是用来存
  • log4cplus 分级显示控制

    前不久已经整理过一篇关于log4cplus介绍和使用基础的文章 这次来看看如何更好的使用log4cplus这个 功能强大的日志系统吧 层次结构 在log4cplus中 所有logger都通过一个层次化的结构 其实内部是hash表 来组织的
  • Python中@property和@setter的用法

    一 property 用法 可以使用 property装饰器来创建只读属性 property装饰器会将方法转换为相同名称的只读属性 这样可以防止属性被修改 实例 class DataSet object property def metho
  • mysql grouping sets_GROUPING SETS与GROUP_ID

    SELECT E DEPARTMENT ID DID E JOB ID JOB E MANAGER ID MID SUM E SALARY SUM SAL COUNT E EMPLOYEE ID CNT GROUP ID GG FROM E
  • FreeRTOS源码探析之——软件定时器

    软件定时器是FreeRTOS中的一个重要模块 使用软件定时器可以方便的实现一些与超时或周期性相关的功能 本篇从FreeRTOS的源码入手 来分析FreeRTOS软件定时器的运行机理 1 基础知识 1 1 软件定时器与硬件定时器的区别 硬件定
  • 开放-封闭原则

    我们在做任何系统的时候 都不要指望系统一开始就完全确定需求 然后再也不发生变化 这是不现实 也是不科学的想法 既然需求是一定会发生变化的 那么如何在面对需求的变化时 设计的软件可以相对容易修改 不至于说 新需求一来就要把整个程序都推倒重来呢
  • 【Python】利用format方法保留三位小数

    format方法是内置的Python字符串格式化方法 基本语法为 str format 它增强了字符串格式化的功能 基本语法是通过 和 来代替以前的 format 函数可以接收多个参数 位置可以不按顺序 具体实例如下 print 0f fo
  • UP-DETR:用无监督的方式对Transformer进行预训练来做物体检测

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 因公众号更改了推送规则 记得读完点 在看 下次AI公园的新文章就能及时出现在您的订阅列表中 作者 Synced 编译 ronghuaiyang 导读 不仅对CNN的backbone预训
  • ReactHooks之useEffect

    useEffect 副作用钩子 useEffect相当于 componentDidMount 组件挂载 componentDidUpdate 组件更新 和 componentWillUnmount 组件将要销毁 这三个生命周期函数的组合 u
  • 计算机处理器性能排名,电脑处理器性能排行榜

    cpu可以说是电脑的心脏 作为电脑的核心存在 cpu性能对电脑性能的影响不言而喻 虽然说因为人民币贬值 cpu价格全面上涨近10 那么电脑处理器性能的市场行情怎么样 下面给大家讲解电脑处理器性能排行榜了 电脑处理器性能排行榜 下面这个cpu
  • Windows 7下安装CentOS 7 Linux双操作系统

    参考文章 1 https blog csdn net zh175578809 article details 78576193 2 https jingyan baidu com article c275f6bacc3326e33c7567
  • Xmodem/Ymodem/Zmodem协议详解

    序 Xmodem Ymodem和Zmodem协议是最常用的三种通信协议 Xmodem协议是最早的 传输128字节信息块 之后也支持到1k的传输 Ymodem是Xmodem的增强版协议 具有传输快速稳定的优点 它可以一次传输1024字节的信息
  • 微信小程序tab切换,(scroll-view + swiper)可滑动切换,导航栏跟随滚动实现

    微信小程序tab切换 scroll view swiper 可滑动切换 导航栏跟随滚动实现 1 wxml tab
  • LeetCode 707. 设计链表

    题目链接 https leetcode cn problems design linked list C 代码如下 class MyLinkedList private 定义单链表的节点 struct ListNode int val Li
  • Qt中QMessageBox提示框设置样式表Qss美化并HTML修改字体大小和颜色

    QMessageBox中写Qss样式表的写法 QString中补上前端HTML的标签 void NetWorkInfo detail QString det QList
  • 客户通道短信平台开发—移动云短信系统

    一 平台能接入的通道接口 1 各种类型的 HTTP 通道 支持 GET POST 返回格式支持 XML JSON 2 支持CMPP通道的接入 3 支持回复通道 上行 支持客户回复在平台中可查看 4 状态通道 返回真实的状态 二 我们提供的服
  • PHP 实现 apple 苹果快捷登录

    实现原理 1 安装外部库php jwt 在项目的composer json 同级目录下运行 composer require firebase php jwt 执行失败的话可借鉴本文 https blog csdn net qq 24909