钉钉登录介绍
移动应用钉钉登录是基于OAuth2.0协议标准构建的钉钉OAuth2.0授权登录系统。
- 目前移动应用上钉钉登录只提供原生的登录方式,需要用户安装钉钉客户端才能配合使用。
- 对于Android应用,建议一直显示钉钉登录按钮,当用户手机没有安装钉钉客户端时,请引导用户下载安装钉钉客户端。
某员工在使用企业自研发的APP客户端时,需要登录账号密码,为了方便登录,可以在登录页面内直接点击钉钉进行登录,使用钉钉账号密码实现登录该APP客户端。 下图是中银国际客户端的登录页面,已注册钉钉账号并且本机已安装钉钉客户端的用户,可以直接使用钉钉授权登录,无需输入账号密码。 当您的应用需要使用钉钉登录时,需要先在钉钉开放平台中新增钉钉应用,配合使用钉钉开放平台提供的SDK进行授权登录请求接入。正确接入SDK后并拥有相关授权域scope(即授权的范围,目前钉钉仅支持授权登录,获取用户的基本信息)权限后,开发者移动应用会在终端本地拉起钉钉应用进行授权登录,钉钉用户确认后钉钉将拉起开发者移动应用,并带上授权临时票据code参数。再调用钉钉的个人用户信息接口可获取登录人的基本信息,包括手机号、钉钉昵称、钉钉头像URL等。 更新时间:2022-10-2 在使用移动应用接入钉钉登录之前,你需要完成以下准备工作: Android Studio 环境下: 参数说明: 参数 是否必填 备注 appId 是 钉钉开放平台应用标识,即第一步中获取的AppKey。 redirectUri 是 授权通过/拒绝后回调地址。 需要与创建应用时填写的回调域名保持一致。 responseType 是 当前只支持固定值code,授权通过后返回authCode。 scope 是 应用授权作用域。授权页面显示的授权信息以应用注册时配置的为准 当前只支持两种输入: nonce 否 字段值任意填写,授权登录后原样返回。 state 否 用于保持请求和回调的状态,授权请求后原样带回给第三方。 该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验。 prompt 否 固定值为consent,会进入授权确认页。 第三步截图只在首次授权登录时出现。 第三步截图只在首次授权登录时出现。 返回值 说明 error 取值: authCode 授权码,可换取个人用户accessToken的凭证。 authCode只能使用一次。 state 调用方标识其请求的唯一性的标志,state字符串长度不能超过1K。 使用步骤四返回的authCode,调用获取用户token接口,换取用户个人access_token。 使用步骤五获取的用户个人access_token,调用获取用户通讯录个人信息接口,获取用户个人手机号、用户的钉钉昵称、头像URL、用户的个人邮箱等信息。 更新时间:2022-10-2 在使用移动应用接入钉钉登录之前,你需要完成以下准备工作:使用场景
使用说明
准备工作
实现流程
步骤一:创建钉钉应用
步骤二:搭建开发环境
如需混淆,建议混淆文件中增加:步骤三:发送请求到钉钉
AuthLoginParam.AuthLoginParamBuilder builder = AuthLoginParam.AuthLoginParamBuilder.newBuilder();
builder.appId(yourAppId);
builder.redirectUri(yourRedirectUri);
builder.responseType(responseType);
builder.scope(scope);
builder.nonce(nonce);
builder.state(state);
builder.prompt(prompt);
IDDAuthApi authApi = DDAuthApiFactory.createDDAuthApi(context, builder.build());
authApi.authLogin()
当前用户已安装钉钉,则跳转钉钉APP拉起授权登录页
当前用户未安装钉钉时,通过H5登录并授权
步骤四:接收授权结果
步骤五:获取用户个人access_token
public class Test {public static com.aliyun.dingtalkoauth2_1_0.Client createClient() throws Exception {
Config config = new Config();
config.protocol = "https";
config.regionId = "central";return new com.aliyun.dingtalkoauth2_1_0.Client(config);
}public void getUserToken() throws Exception {
com.aliyun.dingtalkoauth2_1_0.Client client = Test.createClient();
GetUserTokenRequest getUserTokenRequest = new GetUserTokenRequest()
.setClientId("dingzxxxx") //第一步创建应用时获取的AppKey。
.setClientSecret("XyJONrxxxxx") //第一步创建应用时获取的AppSecret。
.setCode("18ec1db4xxxxx") //第四步获取的authCode。
.setGrantType("authorization_code");try {
GetUserTokenResponse userToken = client.getUserToken(getUserTokenRequest);
System.out.println(JSON.toJSONString(userToken));
} catch (TeaException err) {if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {// err 中含有 code 和 message 属性,可帮助开发定位问题
System.out.println(JSON.toJSONString(err));
}
} catch (Exception _err) {
TeaException err = new TeaException(_err.getMessage(), _err);if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {// err 中含有 code 和 message 属性,可帮助开发定位问题
System.out.println(JSON.toJSONString(err));
}
}
}
}
步骤六:获取用户个人信息
public class Test {public static com.aliyun.dingtalkcontact_1_0.Client createClient() throws Exception {
Config config = new Config();
config.protocol = "https";
config.regionId = "central";return new com.aliyun.dingtalkcontact_1_0.Client(config);
}public void getUserInfo() throws Exception {
com.aliyun.dingtalkcontact_1_0.Client client = Test.createClient();
GetUserHeaders getUserHeaders = new GetUserHeaders();
getUserHeaders.xAcsDingtalkAccessToken = "17e756exxxx";//第五步获取的个人用户Token。
try {
GetUserResponse response = client.getUserWithOptions("me", getUserHeaders, new RuntimeOptions());
System.out.println(JSON.toJSON(response));
} catch (TeaException err) {if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {// err 中含有 code 和 message 属性,可帮助开发定位问题
System.out.println(JSON.toJSONString(err));
}
} catch (Exception _err) {
TeaException err = new TeaException(_err.getMessage(), _err);if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {// err 中含有 code 和 message 属性,可帮助开发定位问题
System.out.println(JSON.toJSONString(err));
}
}
}
}
准备工作
步骤一:接入钉钉登录
步骤二:配置iOS应用
步骤三:授权登录
在AppDelegate.m文件中引用AppDelegate.h
,在@implementation AppDelegate中增加如下代码:
服务端通过Code调用sns/getuserinfo_bycode接口获取授权用户的个人信息,详情请参考根据sns临时授权码获取用户信息。