开发者社区> 问答> 正文

java免登陆

免登陆,什么是免登陆?实现的是什么?
首先登陆你的微应用需要账号密码,免登陆就是通过钉钉点击你的微应用进入不需要输入账号密码。
所以实现免登陆的目的就是要获取通过微应用点击进入的用户的钉钉用户信息,然后把这个用户信息和你数据库里面的用户相关联,比如手机号相同对比手机号,或者保存钉钉userid到你的数据库,下次对比
1.先根据appid获取code。钉钉会把code加在你的回调地址后面


//首页地址是:******/goMobileLogin?appid=dinged340df3eb1274d2

@RequestMapping(value = "/goMobileLogin", method = RequestMethod.GET)
    public ModelAndView goMobileLogin(HttpServletRequest request,
                                      HttpServletResponse response) throws IOException {
        if (StringUtils.isNotBlank(request.getParameter("appid"))) {//钉钉登录返回ding.jsp,把appid传过去
            ModelAndView mod = new ModelAndView();
            mod.addObject("appid", request.getParameter("appid"));
            mod.setViewName("/login/ding");
            return mod;
ding页面访问地址:
<meta http-equiv="refresh" content="0;URL=https://oapi.dingtalk.com/connect/oauth2/authorize?appid=<%=request.getParameter("appid")%>&response_type=code&scope=SCOPE&redirect_uri=http;//xxxx.com/login/goDingLogin(你的项目回调地址)&state=STATE"/>


2.你回调地址获取链接传过来的code
@RequestMapping(value = "/goDingLogin", method = RequestMethod.GET)
public ModelAndView goDingLogin(HttpServletRequest request,
                                HttpServletResponse response) throws IOException {
    if (StringUtils.isNotBlank(request.getParameter("code"))) {//获取code
        String code = request.getParameter("code");
3.获取了code后,根据code和access_token来获取钉钉用户的个人信息,用下面的方法获取token
String token=getToken();//获取token
//获取用户信息
HttpClient    httpClient=new DefaultHttpClient();
URI url = new URI("https://oapi.dingtalk.com/user/getuserinfo?access_token=token&code=code ");
HttpGet get = new HttpGet(url);
HttpResponse response = httpClient.execute(get);
HttpEntity entity=response.getEntity();
if(entity!= null){
    JSONObject jsonObject=JSONObject.parseObject(EntityUtils.toString(entity));
    if(null!=jsonObject.get("userid")){
system.out.print(jsonObject.get("userid"))//获取钉钉用户的id
}
}

获取token的方法
public static String  getToken() throws ClientProtocolException, IOException{
HttpClient    httpClient=new DefaultHttpClient();
URI url = new URI("https://oapi.dingtalk.com/gettoken?corpid=dinged340df3eb1274d2&corpsecret=WPxxxInU-CUXXQ");
HttpGet get = new HttpGet(url);
HttpResponse response = httpClient.execute(get);
HttpEntity entity=response.getEntity();
if(entity!= null){
    JSONObject jsonObject=JSONObject.parseObject(EntityUtils.toString(entity));
    if(jsonObject.get("errcode")==0){
        return jsonObject.get("access_token").toString();
     }
   }
}



//如果报错javax.net.ssl.SSLException: hostname in certificate didn't match: <oapi.dingtalk.com> != <*.laiwang.com> OR <*.laiwang.com>
//需修改了HOST验证,此处省略,交流495120021


两个工具类:



展开
收起
略~~~ 2016-02-25 17:45:09 19167 0
15 条回答
写回答
取消 提交回答
  • 回 2楼dygroup的帖子
    我觉得应该是corpid

    -------------------------

    回 楼主略的帖子
    您好。我对您说的这句有点不理解。
    所以实现免登陆的目的就是要获取通过微应用点击进入的用户的钉钉用户信息,然后把这个用户信息和你数据库里面的用户相关联,比如手机号相同对比手机号,或者保存钉钉userid到你的数据库,下次对比
    我的问题是:通过corpid、corpsecret获得accesstoken后,可以获得jsticket、签名参数,免登授权码。
    通过‘免登授权码’,‘accesstoken’获得userid的原理是什么?钉钉怎么知道是哪个用户在发送请求?
    2018-01-06 09:27:06
    赞同 展开评论 打赏
  • Rejava免登陆
    我项目启动调用获取token的接口一直连接超时,但是main 没问题,请教一下这是个什么情况?
    2017-07-28 17:38:47
    赞同 展开评论 打赏
  • Rejava免登陆
    oapi.dingtalk.com/user/getuserinfo
    你们这些接口的返回码是什么意思啊,都没有文档。
    返回{"errcode":40078,"errmsg":"不存在的临时授权码"}该怎么解决。
    2016-05-16 12:48:21
    赞同 展开评论 打赏
  • Rejava免登陆
    想问一下,免登成功后,是如何跳转到成功后的页面的?
    2016-05-08 22:06:17
    赞同 展开评论 打赏
  • 回 12楼竹梅的帖子
    URL应该是哪个?
    2016-05-06 15:58:47
    赞同 展开评论 打赏
  • 懂java web技术开发的自由者
    回 13楼钉子163的帖子
    我们目前推出的钉铛已完成从钉钉无缝集成企业内部应用,而且无需更改企业应用代码,只需要简单的配置轻松实现免登效果;即便是零开发基础的人员上手也是轻而易举,简单易懂。
    2016-04-12 14:55:16
    赞同 展开评论 打赏
  • 回 12楼竹梅的帖子
    您的签名校验52013最后是怎么解决的?

    -------------------------

    Rejava免登陆
    我们自己弄出来了,希望供大家参考。
    dd.config里面要把正确的参数,agentId,url,timestamp,signature全都输出,不能照搬demo
    2016-04-02 20:53:47
    赞同 展开评论 打赏
  • 回 7楼竹梅的帖子
    一直不成功,.net没有成功的,官方也没有相关资料
    2016-04-02 20:43:06
    赞同 展开评论 打赏
  • 回 13楼(钉子163) 的帖子
    不要用测试工具测试出来的签名,那个只是表示接口是这样调用的,不要直接使用
    2016-03-24 10:47:35
    赞同 展开评论 打赏
  • 补充一下,agentId 是在微应用中的详情中可以看到,微应用管理在 https://oa.dingtalk.com/#/microApp/microAppList
    2016-03-15 18:34:43
    赞同 展开评论 打赏
  • 回 6楼(钉子163) 的帖子
    code是通过调用jsapi获取的
    dd.runtime.permission.requestAuthCode({
        corpId: "corpid",
        onSuccess: function(result) {
        /*{
            code: 'hYLK98jkf0m' //string authCode
        }*/
        },
        onFail : function(err) {}

    })
    里面使用的是企业corpId

    -------------------------

    回 3楼(钉子163) 的帖子
    您是哪步需要用到
    如果是获取免登code,使用的是corpId;
    如果是企业自建的微应用,在dd.config中是agentId;
    建议您将代码贴下,这样更容易了解问题并解决

    -------------------------

    回 11楼(钉子163) 的帖子
    好的,有问题及时反馈,谢谢您的支持
    2016-03-15 18:11:26
    赞同 展开评论 打赏
  • 回 3楼钉子163的帖子
    随着功能的增多,逻辑也是越来越复杂,demo也新增了很多逻辑。后续我们会做优化,多谢关注。

    -------------------------

    回 2楼dygroup的帖子
    appid是该微应用的id
    2016-03-15 11:10:05
    赞同 展开评论 打赏
  • Rejava免登陆
    appId是第三方服务商提供的软件服务ID?现在的官方demo怎么越弄越不方便学习了

    -------------------------

    Rejava免登陆
    appid是企业ID好像,我用企业ID可以获取code

    -------------------------

    回 7楼竹梅的帖子
    按demo获取_config返回,报权限调用失败,code:52013-签名校验失败errorcode:3
    后台返回的JSON数据,ticket和sign都有
    使用权限调试工具生成的签名和后台生成的也是一样的。。

    -------------------------

    Rejava免登陆
    应该找到原因了,生成签名的URL不一样。。

    -------------------------

    Rejava免登陆
    问题还在,现在获取到的签名跟测试工具测试出来的签名是一样的。。不过实际运行还是报原来的code:52013-签名校验失败errorcode:3
    2016-03-14 16:37:54
    赞同 展开评论 打赏
  • Rejava免登陆
    appid是如何获得的?是微应用的的agentid还是企业的corpId?
    2016-03-09 09:40:15
    赞同 展开评论 打赏
  • 感谢您的分享!
    2016-02-26 09:15:12
    赞同 展开评论 打赏
滑动查看更多
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
OpenCrypto Unchaining the Java 立即下载
Java Your(Next) 立即下载
Java8简明教程 立即下载