Code Monkey home page Code Monkey logo

loginhelper's Introduction

这是什么

众所周知,最近苹果又整幺蛾子了,提供的 apple id 稍不留神就会被永远不看注意事项的睿智用户开启两步认证,当你费劲千辛万苦关闭之后,又会被另一个睿智用户开启。宝贵的时间怎么能花在这种重复的事情上呢?

https://inews.gtimg.com/newsapp_bt/0/12544143696/641

所以说,要用魔法打败魔法

效果演示

https://github.com/AppleIdLoginHelper/AppleIdLoginHelper/blob/master/img/Snipaste_2022-01-30_01-42-05.png

流程简要说明

  • 注册或购买一个 apple id 账户(广告位招租)
  • 购买软件礼品卡喂给 apple id (广告位招租)
  • 注册或购买一个 google voice 账户(广告位招租)
  • appleid.apple.com 登录你的 apple id 开启两步认证
  • 绑定手机号时,使用你 google voice 账户持有的号码
  • 参考文档,将此项目部署完成,然后将网站链接发给用户
  • 用户登录时在网站获取验证码,便可完成登录

注意事项

只需要给一个谷歌账户开启 oauth2.0 。如果你买了持有不同 google voice 号码的谷歌账户,可以根据文末官方教程链接,设置邮件转发,转发到这个开启 oauth2.0 的谷歌账户

配置账户

  • 使用你的 google voice 账户登录 GCP 控制面板:cloud.google.com
  • 登录后,在左侧侧边栏找到 api和服务,点击子项 oauth同意屏幕
  • 点击右侧的 创建项目 按钮
  • 项目名称和位置用默认填写的就行,然后点击创建
  • 等待页面加载完成
  • User Type 选外部
  • 应用名称 随便
  • 用户支持地址邮件 选你的账户
  • 已获授权的网域 填你的域名
  • (如果你的域名是 my.domain.com 这种子域名,填 domain.com 就行)
  • 开发者联系信息 填你的账户
  • 范围页面无需设置,直接点击 保存并继续
  • 添加测试用户,输入你的 google voice 账户邮箱
  • 点击凭据 -> 创建凭据 -> oauth
  • 应用类型:web应用
  • 授权js来源 填写你的域名
  • (如果你的域名是 my.domain.com 这种子域名,那就填 my.domain.com!和上面的填法不一样!
  • 授权重定向url 填写你的域名,并在末尾加上 /callback
  • (如果你的域名是 my.domain.com 这种子域名,那就填 my.domain.com/callback!和上面的填法不一样!
  • 等待创建完成,然后在弹出的对话框中,点击下载 json 文件
  • 将文件重命名为 credentials.json 后上传到网站根目录
  • 顶部搜索框搜索 gmail api
  • 点击第一个搜索结果,点击 启用

配置网站

  • 在你的域名控制台添加一个 A 记录指向服务器 IP
  • 新建一个网站

宝塔用户

  • 网站目录加上 /public
  • 伪静态选择 thinkphp
  • 确保这些函数没有被禁用:putenv proc_open proc_get_status

lnmp.org 用户

  • 网站目录加上 /public
  • include rewrite/none.conf; 改成 include rewrite/thinkphp.conf;

还需要额外执行

sed -i 's/,putenv//g' /usr/local/php/etc/php.ini
sed -i 's/,proc_open//g' /usr/local/php/etc/php.ini
sed -i 's/,proc_get_status//g' /usr/local/php/etc/php.ini
sed -i 's/^fastcgi_param PHP_ADMIN_VALUE/#fastcgi_param PHP_ADMIN_VALUE/g' /usr/local/nginx/conf/fastcgi.conf
lnmp restart

进入网站根目录,然后移除防跨站

chattr -i .user.ini
chattr -i public/.user.ini
rm -rf .user.ini public/.user.ini

拉取代码

git clone https://github.com/AppleIdLoginHelper/LoginHelper .

安装 composer 命令(已安装可跳过)

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer

安装依赖包

composer install

授权

chmod 755 -R *
chown www -R *

复制配置文件

cp .example.env .env

编辑配置文件,配置数据库

[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = 你的数据库名称
USERNAME = 数据库用户
PASSWORD = 数据库用户密码
HOSTPORT = 3306
CHARSET = utf8
DEBUG = true

配置其他选项

[OTHER]
AUTO_REFRESH = false
REFRESH_INTERVAL = 5
BLOCK_WEBSITE_LOGIN = false
BLOCK_ICLOUD_LOGIN = false
  • AUTO_REFRESH 网页自动刷新开关,开启需改为 true
  • REFRESH_INTERVAL 如果开启网页自动刷新,则每隔几秒刷新一次
  • BLOCK_WEBSITE_LOGIN 是否拦截官网登录验证码(appleid.apple.com),开启需改为 true
  • BLOCK_ICLOUD_LOGIN 是否拦截网页icloud登录验证码(icloud.com),开启需改为 true

使用 phpmyadmin 或使用命令 mysql 导入数据库结构

/database/verify.sql

进入控制器目录

cd app/controller

编辑文件 Index.php

// 开了 oauth2.0 的 gmail 账户 也是接收其他 gmail 转发邮件的收件箱
$email_address = '';

// '你买的有google voice号的gmail账户' => '(对应下载的软件名称或其他备注) 绑定这个gv号的apple id账户',
        
$email_correspondence = [
    '' => '',
];
  • $email_address 就是你的 google voice 账户
  • $email_correspondence 是为了解决多个 apple id 共用一个面板设计的

情境假设

  • 你有两个 apple id ,一个可以下载应用 app_a,一个可以下载应用 app_b
  • 你的 google_voice_1 账户持有的电话号码绑定了可以下载 app_aapple_id_a
  • 你的 google_voice_2 账户持有的电话号码绑定了可以下载 app_bapple_id_b
  • 你开启了 oauth2.0google voice 账户是 google_voice_1
  • 修改 google_voice_2 账户的设置,将邮件转发到 google_voice_1 账户
  • 那么你应该这么配置上面的代码
$email_address = '<google_voice_1>';
$email_correspondence = [
    '<google_voice_1>' => '(app_a) <apple_id_a>',
    '<google_voice_2>' => '(app_b) <apple_id_b>',
];

如果你只有一个 apple id ,填写模板是

$email_address = '<google_voice_1>';
$email_correspondence = [
    '<google_voice_1>' => '(app_a) <apple_id_a>',
];

填写示范

$email_address = '[email protected]';
$email_correspondence = [
    '[email protected]' => '(netflix) [email protected]',
];

在网站目录下执行

php quickstart.php
  • 复制生成的链接,在浏览器中粘贴访问
  • 选择当前登录的账户
  • 会提示 此应用未经 Google 验证
  • 点左边的继续(不是那个大的蓝色按钮)
  • 授予 gmail 应用访问权限
  • 会重定向到你的网站,根据页面提示操作

然后正常情况下应该是返回

Labels:
- CHAT
- SENT
- INBOX
- IMPORTANT
- TRASH
- DRAFT
- SPAM
- CATEGORY_FORUMS
- CATEGORY_UPDATES
- CATEGORY_PERSONAL
- CATEGORY_PROMOTIONS
- CATEGORY_SOCIAL
- STARRED
- UNREAD

大功告成!访问 https://your.domain.com/test 浏览效果吧!

故障排查

mkdir(): permission denied

进入网站根目录,执行

chmod 755 -R *
chown www -R *

未定义数组索引: messages

收件箱需要有至少一封包含关键词 Apple Id 的邮件。一般来说 google voice 收到的短信都会自动转发到 gmail 收件箱中

我想要修改 google voice 账户登录密码

可以,但修改完成后,需要重新执行授权。进入网站根目录,执行:

rm -rf token.json
php quickstart.php

mysql 1366 incorrect string value

更新到最新 commit 即可

方法不存在:app\controller\Index->index()

访问网站的路径是 /test

Token has been expired or revoked.

在GCP控制台将应用发布成正式应用,token便可长期有效

rm -rf token.json
php quickstart.php

账户列显示 unknow

$email_correspondence 配置存在问题,程序不知道邮箱验证码应该分配给哪一个 Apple ID

后续建议

关闭 debug 模式

虽然使用的是最新 thinkphp 版本,但是为了安全,仍建议关闭调试模式

  • 进入网站根目录
  • 编辑 .env
  • APP_DEBUG = true 改成 APP_DEBUG = false

修改网站路径

默认路径是 test ,为了确保只有你和用户知道这个地址,建议修改

  • 进入网站根目录
  • 进入 route 目录
  • 编辑 app.php
  • 将第一个 test 改成其他字符串

例如,将

Route::get('/test', 'index/test');

改成

Route::get('/amdyes', 'index/test');

设置邮件转发

参考官方教程 https://support.google.com/mail/answer/10957

loginhelper's People

Contributors

appleidloginhelper avatar jusufus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

loginhelper's Issues

真滴棒 这个项目~

最近被弱智客户搞的半天都在解二次验证,不过话说大佬 改账号主体和密码真的没法防吗?最近被搞的有点头大

执行后报错这个

PHP Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 77: error setting certificate verify locations:
CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://oauth2.googleapis.com/token in /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:211
Stack trace:
#0 /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(158): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array)
#1 /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(110): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#2 /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php(47): GuzzleHttp\Handler\CurlFactory::finish(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#3 /www/wwwroot/js/vendor in /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php on line 211

Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 77: error setting certificate verify locations:
CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for https://oauth2.googleapis.com/token in /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:211
Stack trace:
#0 /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(158): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array)
#1 /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(110): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#2 /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php(47): GuzzleHttp\Handler\CurlFactory::finish(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#3 /www/wwwroot/js/vendor in /www/wwwroot/js/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php on line 211

建议修改验证码显示区域

将验证码区分为
最新验证码为 xxx
近两分钟没有收到验证码则显示【近期未收到验证码】

历史验证码
xxx
xxx
xxx
比较容易区分,因为大部分会魔法的人会连续多次输入过期的验证码触发风控导致登录账号显示验证错误次数过多无法发送验证码

报错,求解决方式 方法不存在:app\controller\Index->index()

#0 [0]HttpException in Controller.php line 107
方法不存在:app\controller\Index->index()

                    $this->request->setAction($actionName);
                } catch (ReflectionException $e) {
                    $reflect = new ReflectionMethod($instance, '__call');
                    $vars    = [$action, $vars];
                    $this->request->setAction($action);
                }
            } else {
                // 操作不存在
                throw new HttpException(404, 'method not exists:' . get_class($instance) . '->' . $action . '()');
            }

            $data = $this->app->invokeReflectMethod($instance, $reflect, $vars);

            return $this->autoResponse($data);
        });
}

protected function parseActions($actions)

Call Stack (折叠)
in Controller.php line 107
at Controller->think\route\dispatch{closure}() in Pipeline.php line 59
at Pipeline->think{closure}() in Pipeline.php line 66
at Pipeline->then() in Controller.php line 113
at Controller->exec() in Dispatch.php line 90
at Dispatch->run() in Route.php line 785
at Route->think{closure}() in Pipeline.php line 59
at Pipeline->think{closure}() in Pipeline.php line 66
at Pipeline->then() in Route.php line 786
at Route->dispatch() in Http.php line 216
at Http->dispatchToRoute() in Http.php line 206
at Http->think{closure}() in Pipeline.php line 59
at Pipeline->think{closure}() in TraceDebug.php line 71
at TraceDebug->handle()
at call_user_func() in Middleware.php line 142
at Middleware->think{closure}() in Pipeline.php line 85
at Pipeline->think{closure}() in Pipeline.php line 66
at Pipeline->then() in Http.php line 207
at Http->runWithRequest() in Http.php line 170
at Http->run() in index.php line 20
Environment Variables

其实可以区分设备登陆还是网页登陆的。看看能不能过滤下短信

其实是有特征的,具体在下面:

网页登陆:

Apple ID 代码为:169857。请勿与他人共享。 @apple.com #169857 %apple.com

设备登陆:

Apple ID 代码为:556478。请勿与他人共享。

网页登陆会带上网址后缀,设备上不会出现,我看了代码:
$list = $httpClient->get('https://gmail.googleapis.com/gmail/v1/users/'.$email_address.'/messages?maxResults=10&q=from: txt.voice.google.com Apple ID');

应该是过滤了包含Apple ID的短信才会出现,看看能不能写个黑名单,若短信里面出现 @apple.com 或者%apple.com,就不接收。

运行php quickstart.php后,打开网站提示这个是什么原因呢

Warning: require(): open_basedir restriction in effect. File(/www/wwwroot/id.xxxx/vendor/autoload.php) is not within the allowed path(s): (/www/wwwroot/id.xxxk.live/public/:/tmp/) in /www/wwwroot/id.xxxx/public/index.php on line 15

Warning: require(/www/wwwroot/id.coffee55k.live/vendor/autoload.php): failed to open stream: Operation not permitted in /www/wwwroot/id.xxx.live/public/index.php on line 15

Fatal error: require(): Failed opening required '/www/wwwroot/id.coffee55k.live/public/../vendor/autoload.php' (include_path='.:') in /www/wwwroot/id.xxxx.live/public/index.php on line 15

一直显示invalid token

Client error: POST https://oauth2.googleapis.com/token resulted in a 400 Bad Request response:
{
"error": "invalid_grant",
"error_description": "Token has been expired or revoked."
}

反复重建了2次换了2个不同的google voice账号建api都这样

发现一个很大的弊端

在iphone上通过验证码方式登陆的时候,这个iphone将会变为可信设备。如果不在appleid网页版上删除此设备的话,那此iphone可以百分百的修改密码。即便在iphone上退出账号也无用

我弄了3个voice,今天突然有一个收不到验证码,然后

我弄了3个voice,今天突然有一个收不到验证码,然后我登录这个谷歌voice查看,发下其他消息都可以正常转发到gmail里,就苹果的验证码消息没有转发到gmail里,所以导致收不到验证码,

我对谷歌voice的设置不是非常熟悉,为什么突然间就不转发苹果的短信到gmail了呢,其他的消息我测试了一下,都可以正常转发的,

请假~~~

程序无法显示邮件,如何解决?

@NacIFre 这位大佬给出了修改下index.php文件,把txt.voice.google.com改成google.com就可以了
这个我已经修改了,能正常打开了!
现在遇到一个问题
邮箱能接收到验证码
程序无法获取到验证码

这是什么情况?

image
这是什么情况?

Warning: require(/www/wwwroot/unlock.mlios.xyz/public/../vendor/autoload.php): failed to open stream: No such file or directory in /www/wwwroot/unlock.mlios.xyz/public/index.php on line 15

Fatal error: require(): Failed opening required '/www/wwwroot/unlock.mlios.xyz/public/../vendor/autoload.php' (include_path='.:') in /www/wwwroot/unlock.mlios.xyz/public/index.php on line 15

最近平台间歇性收不到验证码?

排查发现GV号里收到了短信验证码,但是没有转发到Gmail的邮箱上,所以系统也不显示新的验证码,最近几天才出现的问题,重新授权也执行过了:
rm -rf token.json
php quickstart.php
貌似是服务器抽风?有时候等过一两个小时重新发邮箱收到验证么系统会马上同步,当你点击重新发送验证码时,邮箱收不到GV转发过来的邮件导致系统不显示新的验证码。请问有大佬遇到同样的情况嘛?

复制生成的链接与不一样

检查过填写的auto都正确的,唯独不同的是我生成连接下面会有一个Enter verification code:

打开连接然后会返回到网站,显示的内容是:
callback

复制下方的字符串,返回 ssh 软件,粘贴并按下回车

4/0AX4XfWguDNCEZckMTTJOwgd2yAVm0BL3ddADnPEkYh7ZXkpfs14f1d-fdhbbf

屏蔽icloud登录验证码

icloud.com 网站登录验证码 跟 apple.com 官网登录验证码 都会有后缀提示
现在迫切的需要 屏蔽 设备登录 icloud的验证码(可有偿)

Apple ID 代码为:171773。请勿与他人共享。
@icloud.com #171773 %apple.com

Apple ID 代码为:919426。请勿与他人共享。
@apple.com #919426 %apple.com

程序今天突然无法获取验证码。多个站点同时失效

程序今天突然无法获取验证码。我搭建了3个站点,今天同时失效

gv能获取验证码,邮件也能获取验证码,但是[LoginHelper]程序突发获取不了验证码。

3个站点用的不同gv,如果是一个配置错误,也不应该是3个站点同时失效。

不知道是不是谷歌修改了什么api什么的、··

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.