belmeng 2020-12-22T06:06:13+00:00 [email protected] Sign In With Apple Transfer 2020-12-22T00:00:00+00:00 belm http://www.belmeng.com/sign-in-with-apple-transfer 苹果登录用户转移

0.背景说明

  • 由于不同公司主体, 苹果登录生成的唯一标识不一样, 所以做应用迁移前, 需要做用户关系的映射。

账号A =》 应用1 迁移到 账号B =》 应用2

  • 相同主体生成的苹果登录唯一标识相同, 所以 , 我们可以在2个账号下各创建一个应用,这些命名为应用3和应用4

账号A =》 应用1 , 应用3

账号B =》 应用2, 应用4 (这些的应用2 实际是等待迁移过来后才有)

  • 应用转移后, 苹果登录用户的唯一标识会立即改变,一定要在转移前做好关系映射,最好衔接工作

1. 准备工作

1.1 生成账号A应用1的client_secret1

由于应用迁移后,应用1的client_secret会立即失效,这里建议使用测试的应用3生成client_secret,需要准备的参数

  • 应用3的苹果登录的p8格式密钥,另存为key.txt,保存在client-secret.rb同级目录下,创建后保存好,不能重复下载 这里创建
  • 账号A的Team ID 查看Team ID
  • 应用3的bundle_id, 也是下面的client_id或者叫Services ID
  • p8格式密钥对应的key id, 一般下载的p8格式密钥, 名称的后面部分就是key id ,或者点击这里对应的应用查看

可以使用以下ruby脚本client-secret.rb命令生成client_secret

require 'jwt'

# Save your private key from Apple in a file called `key.txt`
key_file = 'key.txt'

# Your 10-character Team ID
team_id = 'your team_id'

# Your Services ID, e.g. com.aaronparecki.services
client_id = 'your app bundle_id'

# Find the 10-char Key ID value from the portal
key_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,   # This will be valid for 180 days
  'aud' => 'https://appleid.apple.com',
  'sub' => client_id,
}

token = JWT.encode claims, ecdsa_key, 'ES256', headers

puts token

1.2 生成账号B应用4的client_secret2

参考1.1

2. 获取client_secret1对应的access_token1

func getToken(cid string, csecret string) (access_token string){
	url := "https://appleid.apple.com/auth/token"
	body := fmt.Sprintf("grant_type=client_credentials&scope=user.migration&client_id=%s&client_secret=%s",cid, csecret)

	headers := map[string]string{}
	headers["Content-Type"] = "application/x-www-form-urlencoded"

	res,_ := http.Post(url, body, headers)
	fmt.Println(res)

	access_token = jsoniter.Get([]byte(res), "access_token").ToString()
	return
}

3. 使用access_token1获取transfer_sub

  • uid 为账号A需要转移的openid
  • recipient_team_id 为账号B的team_id
  • token是上面步骤2获取的access_token1
  • client_id和client_secret是上面1.1对应生成的
func getTransferSub(token string, uid string) string{
	url := "https://appleid.apple.com/auth/usermigrationinfo"
	body := fmt.Sprintf("sub=%s&target=%s&client_id=%s&client_secret=%s", uid, recipient_team_id, client_id, client_secret)
	headers := map[string]string{}

	headers["Content-Type"] = "application/x-www-form-urlencoded"
	headers["Authorization"] = "Bearer " + token

	res,_ := http.Post(url, body, headers)
	fmt.Println(uid + ":" + res)

	return jsoniter.Get([]byte(res), "transfer_sub").ToString()
}

4. 获取client_secret2对应的access_token2

参考 步骤2

5. 使用access_token2获取sub

  • transfer_sub 为步骤3生成的
  • rec_client_id和rec_client_secret是上面1.2对应生成的
  • token是上面步骤4获取的access_token2
func exchange(token string, transfer_sub string) (sub string, email string){
	url := "https://appleid.apple.com/auth/usermigrationinfo"
	body := fmt.Sprintf("transfer_sub=%s&client_id=%s&client_secret=%s", transfer_sub, rec_client_id, rec_client_secret)
	headers := map[string]string{}

	headers["Content-Type"] = "application/x-www-form-urlencoded"
	headers["Authorization"] = "Bearer " + token

	res,_ := http.Post(url, body, headers)
	fmt.Println(transfer_sub + ":" + res)

	sub = jsoniter.Get([]byte(res), "sub").ToString()
	email = jsoniter.Get([]byte(res), "email").ToString()

	return
}
]]>
Happy 2019-06-13T00:00:00+00:00 belm http://www.belmeng.com/happy 今天心情不错

我更新了博客

]]>
新的开始 2019-04-11T00:00:00+00:00 belm http://www.belmeng.com/新的开始 参与人: 鲁蒙;闫炳坤;缪则平;陈欣欣;刘婷婷;彭伟;马梓荐;周帮飞

讨论主题

1. 谈谈自己如何学习新知识?

1. 优先找中文文档

2. 看过来人写的博客

3. 结合新需求学习

2. 谈谈如何看待996?

]]>
mac vmware ubuntu shared folder 2015-01-22T13:06:07+00:00 belm http://www.belmeng.com/vmware-mac-ubuntu-shared-folder mac上在VMware Fusion虚拟机里面装了个ubuntu,/mnt/hgfs怎么尝试都看不到mac共享的目录,网上找了各种方法,重启了N次。

解决方案:

apt-get install make gcc
vmware-config-tools (除了hgfs选择yes,其他默认即可)

重新安装VMware tools

mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
cd /mnt/cdrom
tar xzvf VMwareTools-8.8.3-682996.tar.gz -C /tmp
cd /tmp/VMwareTools-8.8.3-682996
./vmware-install.pl
reboot
ls /mnt/hgfs

VMware Fusion 小技巧

ctrl + command mac和虚拟机之间切换
alt + 方向键  多个命令行界面切换

Linux 小tips

sudo passwd root  #初次设置root密码
apt-get install openssh-server #默认安装了openssh-client
ps aux | grep ssh  #查看sshd进程
vim /etc/ssh/sshd_config  #ssh server 配置
service ssh restart #重启ssh服务
PermitRootLogin yes #开启root登录 
AuthorizedKeysFile #取消注释 开启ssh key文件登录
apt-get -d openjdk-7-jre-lib #下载不安装 下载目录 /var/cache/apt/archives
vim /etc/hostname #修改主机名
]]>
vpn pptp 2015-01-11T15:33:26+00:00 belm http://www.belmeng.com/vpn-pptp 周末研究了pptp和shadowsocks服务的搭建,shadowsocks搭建起来比较简单。

#shadowsocks

Github主页:

https://github.com/shadowsocks/shadowsocks   

##Debian / Ubuntu apt-get install -y python-pip && pip install shadowsocks

##Centos: yum install python-setuptools && easy_install pip pip install shadowsocks

启动服务:

ssserver -p 8000 -k password -m rc4-md5 -d start

关闭服务:

ssserver -p 8000 -k password -m rc4-md5 -d stop

启动完成后,使用shadowsocks客户端连接即可,很方便,搭建起来也很快捷,对应的客户端在shadowsocks的github主页上面可以找到。

#pptp

安装步骤参考:

http://www.zhihu.com/question/20113381

1) 安装pptpd(VPN服务器)和ufw(防火墙)

sudo apt-get install pptpd ufw

2)修改ufw规则

sudo ufw allow 22
sudo ufw allow 1723
sudo ufw enable

3)编辑pptpd选项

sudo vim /etc/ppp/pptpd-options

打开文件后,找到以下三行注释掉

refuse-pap
refuse-chap
refuse-mschap

之后在最后的地方添加如下信息

ms-dns 8.8.8.8
ms-dns 8.8.4.4

4) 编辑IP信息以及客户端IP地址范围

sudo vim /etc/pptpd.conf

会打开一个文件,然后在最后添加:

localip 178.62.122.180 (这里改为你自己的VPS的ip地址)
remoteip 10.99.99.100-199 (这里不需要改动)

5)添加VPN用户登录信息,就是你登陆VPN的时候使用的用户名密码

sudo vim /etc/ppp/chap-secrets

按照以下模式添加一个用户账号

[Username] [Service] [Password] [Allowed IP Address]

例如,添加一个 用户名为pptpvpn,密码为fBRucTiXQtkr的vpn账号,可以创建多个,一行一个用户。

pptpvpn pptpd fBRucTiXQtkr *

6)重启pptpd

sudo /etc/init.d/pptpd restart

7)编辑系统设置

sudo vim /etc/sysctl.conf

去掉下面一行的注释,改完后为:

net.ipv4.ip_forward=1

重新加载系统设置

sudo sysctl -p

8)修改ufw防火墙设置

sudo vim /etc/default/ufw

DEFAULT_FORWARD_POLICY = "DROP"

改为:

DEFAULT_FORWARD_POLICY = "ACCEPT"

9)继续修改ufw防火墙设置

sudo vim /etc/ufw/before.rules

在文本最开始处复制添加如下内容:

# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow forward traffic to eth0
-A POSTROUTING -s 10.99.99.0/24 -o eth0 -j MASQUERADE
# Process the NAT table rules
COMMIT

10)重启防火墙

sudo ufw disable && sudo ufw enable

更新:这里可能会看到一条Error信息: ERROR: problem running ufw-init

如果出现这个情况,在你确保没输入错误的命令时,请输入一下命令:

ufw --force enable
]]>
github download single file 2015-01-11T11:22:06+00:00 belm http://www.belmeng.com/github-download-single-file github上面有很多优质的资源,但时间久了,整个项目会很大,有的时候,只需要下载项目里面的一个文件,但github并没有提供这个功能.

比如下载:

https://github.com/belm/belm.github.io/blob/master/_posts/2015-01-04-dns.markdown

这个md文件,在命令行执行

wget https://github.com/belm/belm.github.io/raw/master/_posts/2015-01-04-dns.markdown

只需要把blob替换成raw即可。

]]>
things 2015-01-04T21:37:01+00:00 belm http://www.belmeng.com/things things是个不错的GTD工具,界面简洁明了,iphone和mac两个平台都支持,可惜Things Cloud国内被墙了,不能实现多个终端的同步,还是用OmniFocus吧,能很方便的同步。

]]>
dns 2015-01-04T15:16:01+00:00 belm http://www.belmeng.com/dns
  • 阿里巴巴DNS:223.5.5.5和223.6.6.6
  • 百度DNS:180.76.76.76
  • Google DNS:8.8.8.8和8.8.4.4
  • ]]>
    swift 2015-01-03T23:49:01+00:00 belm http://www.belmeng.com/swift swift刚出来的时候就开始关注,也在知乎上看相关的评论,但总觉得知识学习后,要反复使用才能掌握,很久没用了,该找个项目练习练习了。

    ]]>
    谈谈最近的学习 2015-01-03T22:16:01+00:00 belm http://www.belmeng.com/learn 最近由于工作的需要,想学习下python,之前的一些功能使用的是shell,感觉不是很灵活,当初也只是为了实现功能,代码写得很粗糙,扩展性还可以,但长期来看,并不符合要求。python api比较丰富,功能也比较强大,分析了下anysdk(mac版本),前端界面使用的是QT,后端功能使用的是python,选择python做这个,肯定有它的好处,最近准备好好研究研究。学习无止境,swift也可以写脚本,还可以执行shell命令,以后可以尝试使用它做一些小工具,顺便温习熟悉swift语法,一段时间不用,语法忘记很快,得偶尔用用。

    ]]>