`
wangmengbk
  • 浏览: 288535 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

IOS APPID一键登录服务端验证

阅读更多
public class IosAppIdLoginServiceImp {

    private static final Logger LOGGER = LoggerFactory.getLogger(IosAppIdLoginServiceImpl.class);
@Autowired
private PropertiesResouseUtil propertiesResouseUtil;
    private static final String AUTH_TIME = "auth_time";
    private final static int READ_TIMEOUT = 100;
    private final static int CONNECT_TIMEOUT = 60;
@Override
public Response<T> verifyIdentityToken(Request<IosAppIdLoginDto> request) {
        Response<T> response = new Response<>();
IosAppIdLoginDto iosAppIdLoginDto = request.getRequestParam();
response.setResult(iosAppIdLoginDto);
        try {
            //解析
Map<String, JSONObject> json = parserIdentityToken(iosAppIdLoginDto.getIdentityToken());
JSONObject header = json.get("header");
String kid = header.getString("kid");
//生成publickey
PublicKey publicKey = getPublicKey(kid);
            if (publicKey == null) {
                iosAppIdLoginDto.setSuccess(false);
LOGGER.info("获取苹果验证公钥失败:kid={}",kid);
                return commonResponse;
}
            JSONObject payload = json.get("payload");
//验证
JwtParser jwtParser = Jwts.parser().setSigningKey(publicKey);
jwtParser.requireIssuer(propertiesResouseUtil.getProperty("apple.url"));//+"/auth/keys"
jwtParser.requireAudience(payload.getString("aud"));
jwtParser.requireSubject(payload.getString("sub"));
Jws<Claims> claim = jwtParser.parseClaimsJws(iosAppIdLoginDto.getIdentityToken());
            if (claim != null && claim.getBody().containsKey(AUTH_TIME)) {
//                String sub = claim.getBody().get("sub").toString();//用户的Apple的openId
//                String iss = claim.getBody().get("iss").toString();
//                String aud = claim.getBody().get("aud").toString();
iosAppIdLoginDto.setSuccess(true);
}
        } catch (ExpiredJwtException e1) {
            iosAppIdLoginDto.setSuccess(false);
LOGGER.error("apple token verify fail,identityToken is expired!",e1);
} catch (Exception e2) {
            iosAppIdLoginDto.setSuccess(false);
LOGGER.error("apple token verify fail,error={}", e2);
}

        return commonResponse;
}

    /**
     * 对前端传来的JWT字符串identityToken的第二部分进行解码
     * 主要获取其中的aud和sub,aud对应ios前端的包名,sub对应当前用户的授权openID
     *
     * @param identityToken
* @return
*/
private Map<String, JSONObject> parserIdentityToken(String identityToken) {
        Map<String, JSONObject> map = new HashMap<String, JSONObject>();
String[] arr = identityToken.split("\\.");
String deHeader = new String(Base64.decodeBase64(arr[0]));
JSONObject header = JSON.parseObject(deHeader);
LOGGER.info("获取的header={}",header);
map.put("header", header);
String dePayload = new String(Base64.decodeBase64(arr[1]));
LOGGER.info("获取dePayload={}",header);
JSONObject payload = JSON.parseObject(dePayload);
map.put("payload", payload);
        return map;
}

    /**
     * 获取publickey
     * @param kid
* @return
*/
private PublicKey getPublicKey(String kid) {
         LOGGER.info("get apple public key start,kid={}", kid);
        try {

            Proxy proxy = new Proxy(Proxy.Type.HTTP,new InetSocketAddress(propertiesResouseUtil.getProperty("httpproxy.url"),
Integer.parseInt(propertiesResouseUtil.getProperty("httpproxy.port"))));
OkHttpClient client = new OkHttpClient().newBuilder().proxy(proxy).connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS).readTimeout(READ_TIMEOUT, TimeUnit.SECONDS).build();
Request request = new Request.Builder().url(propertiesResouseUtil.getProperty("apple.url")+"/auth/keys").build();
Response response = client.newCall(request).execute();
            if(response.isSuccessful()){
                // 得到响应体中的身体,将其转成  string
String string = response.body().string();
JSONObject data = JSONObject.parseObject(string);
JSONArray jsonArray = data.getJSONArray("keys");
                if(jsonArray.isEmpty()) {
                    return null;
}
                for (Object object : jsonArray) {
                    JSONObject json = ((JSONObject)object);
                    if(json.getString("kid").equals(kid)) {
                        json = ((JSONObject)object);
Jwk jwa = Jwk.fromValues(json);
                        return jwa.getPublicKey();
}
                }

            }
        } catch (final Exception e) {
            LOGGER.error("apple getPublicKey error", e);
}

        return null;
}


}

pom.xml 引用包

<dependency>
   <groupId>io.jsonwebtoken</groupId>
   <artifactId>jjwt</artifactId>
   <version>0.9.1</version>
</dependency>
<dependency>
   <groupId>com.auth0</groupId>
   <artifactId>jwks-rsa</artifactId>
   <version>0.9.0</version>
</dependency>

 

分享到:
评论

相关推荐

    易优QQ一键登录.zip

    易优QQ一键登录插件是方便会员进行快捷注册登录操作,为站长带来更多活跃会员 使用此插件要注意一下几点: 1、此插件使用前请到 https://connect.qq.com/ 申请appid, appkey, 并注册callback地址 2、配置完成...

    微信小程序开发一键登录 获取session_key和openid实例

    微信小程序开发一键登录 获取session_key和openid实例 思来想去不愿自己的微信小程序是个单机版本.自己又不会写后台.现在借助leancloud可以实现微信小程序一键登录功能.尝试后,做笔记. 第一步:下载av-weapp.js,放到...

    Destoon QQ互联一键登录审核不通过的解决方案

    在QQ互联上申请帐号之后提交了审核, 后台填写APPID和KEY之后自己申请的QQ号可以正常登录,但QQ互联审核的时候一直审核不通过说是您的网站审核未通过,原因是点击QQ登录按钮提示登录失败或出现错误信息(无跳转、...

    微信小程序多用户一键授权绑定系统 v1.0.1

    微信小程序多用户一键授权...apiurl 改为你自己的网址extappid 改成你小程序的 appid然后再上传小程序到微信开放平台的模板里具体的看平台安装教程要安装 ssl 证书 也就是开启 https免费提供,有什么问题自行解决!

    织梦V5.7-QQ微博淘宝登录GBK-加强完整

    1、压缩包解压,根目录覆盖,同时会生成一个oauth文件夹 2、 QQ配置:oauth/config.php文件,分别配置appid...6.10 --修改第三方登录后,不需要邮箱验证,因为邮箱是随机生成的,以免后台开启邮箱验证,存在验证问题。

    织梦5.7QQ登录插件

    4、访问腾讯社区开放平台,http://connect.opensns.qq.com/apply 申请QQ登录APPID及APPKEY,将这两个信息填写到“插件参数配置”中; 5、打开前台需要显示QQ登录的页面模板,添加如下代码: 1)在&lt;/head&gt;上...

    整合QQ登录源码2011

    QQ登录包括QQ帐号一键登录、好友互动、同步信息到QQ空间,可为第三方网站打口碑、引流量。它有如下特点: 拥有庞大用户群的QQ账号一键登录 分享内容、动态同步到QQ空间,增加第三方网站信息的传播性 提供的各种...

    Android端不通过登录SDK实现QQ登录验证代码

    通常的APP如果要调用QQ登录验证,需要使用QQ提供的登录SDK,但是QQ的SDK使用需要申请APP KEY和APPID,还要向腾讯提交比较繁琐的其它申请,而且如果通过该方法,登录信息全部被QQ掌握。 此代码提供了不使用SDK而使qq...

    ios-本地图形验证码(类似极验).zip

    资源过大,持续更新最新源码在:https://github.com/iFindTA/NHGraphCoderPro...2,可统计验证成功、失败次数 3,不依赖于任何SDK平台 4,支持网络图片作为验证码模版(暂未实现) 如果对你有帮助,请亮个 star!

    XE6\XE7移动开发环境搭建之IOS篇

    XE7 & IOS开发之开发账号(3):证书、AppID、设备、授权profile的申请使用,附Debug真机调试、Ad hoc下iPA文件生成演示(XCode5或以上版本推荐,有图有真相) 493 XE8 & IOS开发之免费证书真机调试:开发证书、...

    微信小程序学习点滴《十五》:用户系统 一键登录 获取session_key和openid ...

    现在借助leancloud可以实现微信小程序一键登录功能.尝试后,做笔记. 第一步:下载av-weapp.js,放到utils下. 第二步:使用 const AV = require('../../utils/av-weapp.js');路径根据具体情况而定. 第三步:做初始化.   ...

    QQ互联一键登录审核不通过的解决方案

    在QQ互联上申请帐号之后提交了审核, 后台填写APPID和KEY之后自己申请的QQ号可以正常登录,但QQ互联审核的时候一直审核不通过说是“您的网站审核未通过,原因是“点击QQ登录按钮提示登录失败或出现错误信息(无跳转...

    koalagamekit-ios:考拉游戏平台SDK文件,及接入文档

    :koala: koalagamekit-iossdk对应的服务端接入文档,请移步: 考拉游戏平台SDK接入文档【iOS端】v2.x本文档力求简洁明了。接入者所需要的所有代码及说明,在下面的文档中都有详尽介绍。接入前,要先检查sdk是否是的...

    java微信登录授权源码java

    微信授权登录,根据用户 的Appid和appsecreat进行获取相关的信息,授权登录

    iOS 测试证书生成步骤

    iOS 测试证书生成步骤,包含,测试签名,appID,以及proFile生成步骤,以及appStore上传步骤。

    微信H5支付修改下配置(APPID、商户号等)即可使用

    define('APPID','APPID'); define('APIKEY','商户安全密钥'); define('MCH_ID','商户ID'); define('NOTIFY_URL','http://你的域名/return_url.php'); 2 ,H5支付不能直接在微信浏览器中打开支付,需要打开外部...

    iOS微信第三方登录实现

    在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的移动应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。(注意) 1、下载iOS微信SDK。 ...

    iOS微信第三方登录实例

    本文实例为大家分享了iOS微信第三方登录,供大家参考,具体内容如下 一、准备工作 1、到微信开放平台注册成开发者,获取appid 2、导入WeChatConnection.framework 3、配置URL Schemes 输入appid 例如wx29ce0f21ea...

    iOS QQ第三方登录实现

    本文实例为大家分享了iOS QQ第三方登录实现代码,供大家参考,具体内容如下 一、准备工作 1、到QQ开放平台(http://connect.qq.com/ )注册成为开发者,申请appkey, 2、在URL Types中添加QQ的AppID,其格式为:”...

    各种应用的appId

    iOS ,Iphone上的各类应用App的ID

Global site tag (gtag.js) - Google Analytics