# 配置自定义社会化登录
Authing 提供接入自定义 OAuth2.0 身份提供商的能力,如果你需要连接非 Authing 内置的社会化登录身份源,可以通过本文的方式来实现。
# 创建自定义社会化登录连接
# 填写应用基本信息
进入 Authing 控制台 > 连接身份源 > 社会化登录,在最下方找到「连接自定义社会化登录」,点击右侧的加号。

在弹出的抽屉中,首先填写一些基本的连接信息,连接标志符、显示名称,你可以上传一个应用 Logo。

# 填写身份源基本信息
接下来填写一些外部社会化登录提供商的基本信息,你可以从外部 OAuth2.0 身份提供商的文档中找到相关的 URL 端点,包括授权端点、Token 端点、Scope 可选值。还要填写外部 OAuth2.0 社会化登录身份源的应用 ID 和应用密钥,这些信息你可以在外部 OAuth2.0 社会化登录身份源处找到。

虽然 scope 在这里的表单中是可选的,但某些外部 OAuth2.0 社会化登录身份源可能要求 scope 参数必传,建议在这里填写相应的配置。
授权链接模板是一个字符串模板,你可以使用 ${authEndPoint}、${tokenEndPoint}、${scope}、${clientId}、${clientSecret} 这些宏。
宏与表单项的对应关系如下表:
| 宏 | 表单项 | 
|---|---|
| ${authEndPoint} | 授权 URL | 
| ${tokenEndPoint} | Token URL | 
| ${scope} | scope | 
| ${clientId} | 应用 ID | 
| ${clientSecret} | 应用密钥 | 
示例:
如果授权链接模板填写:
${authEndPoint}?client_id=${clientId}&response_type=code&state=4634641&scope=${scope}&redirect_uri=https://core.authing.cn/connections/oauth2/5fa91b0f50315451dc86086d/callback
将来会生成以下授权 URL:
https://login.microsoftonline.com/8f909eb1-99fe-4f75-b4e0-2f7ab37815c6/oauth2/v2.0/authorize?client_id=fc52a7ab-4172-4db3-9292-e51f85a1576e&response_type=code&state=4634641&scope=openid profile&redirect_uri=https://core.authing.cn/connections/oauth2/5fa91b0f50315451dc86086d/callback
# 上传自定义代码片段
最后,也是最关键的部分,你需要上传自定义代码片段完成 Code 换 Token 和 Token 换用户信息并进行字段对齐的功能。

Authing 已经为你提供了模板代码:
你可以在函数中使用 request-promise (opens new window) 库发送网络请求。
# codeToToken 函数
以下是 codeToToken 函数的模板代码,函数的第一个参数 code 是授权码,你需要用这个 code 从外部 OAuth2.0 社会化登录身份提供商的 Token 端点换取的 AccessToken。
async function codeToToken(code, connection) {
  const options = {
    method: 'POST',
    uri: '外部 OAuth2.0 IdP Token 端点',
    form: {
      client_id: '外部 OAuth2.0 IdP 的应用 ID',
      client_secret: '外部 OAuth2.0 IdP 的应用密钥',
      grant_type: 'authorization_code',
      redirect_uri: 'https://core.authing.cn/connections/oauth2/{连接 ID}/callback',
      code,
    },
    json: true,
  };
  const resp = await request(options);
  // 在这里返回 AccessToken 的字符串值
  return resp.access_token;
}
# tokenToUserInfo 函数
以下是 tokenToUserInfo 函数的模板代码,函数的第一个参数 accessToken 是上一个函数 codeToToken 函数的返回值(本例中为 resp.access_token),你需要用 accessToken 从外部 OAuth2.0 社会化登录身份提供商的用户信息端点换取用户信息,并完成字段对齐。返回值是一个对象,内容必须为符合 Authing 数据格式的用户信息字段,且必须包含 userIdInIdp 字段,该字段内容为用户在外部身份提供商中的唯一标识符,也就是用户 ID。
async function tokenToUserInfo(accessToken, connection) {
  const options = {
    method: 'POST',
    uri: '外部 OAuth2.0 IdP 用户信息端点',
    form: {
      access_token: accessToken,
    },
    json: true,
  };
  const resp = await request(options);
  // 进行字段对齐
  const profile = {
    // 必须包含 userIdInIdp 字段
    userIdInIdp: resp.sub,
    name: resp.name,
    familyName: resp.family_name,
    givenName: resp.given_name,
    photo: resp.picture,
  };
  return profile;
}
请将用户信息对齐到以下字段,即 tokenToUserInfo 函数返回的内容必须为一个对象,且这个对象中的 key 必须存在于下表中的字段名,Authing 用户信息字段含义表:
| 字段名 | 格式 | 含义 | 
|---|---|---|
| username | string | 用户名 | 
| string | 邮箱 | |
| emailVerified | boolean | 邮箱是否验证 | 
| phone | string | 手机号 | 
| phoneVerified | boolean | 手机号是否验证 | 
| birthdate | string | 生日 | 
| familyName | string | 姓氏 | 
| gender | string | 性别 | 
| locale | string | 生日 | 
| middleName | string | 中间名 | 
| givenName | string | 名 | 
| nickname | string | 昵称 | 
| photo | string | 头像链接 | 
| profile | string | 个人资料页链接 | 
| preferredUsername | string | 喜欢的用户名 | 
| updatedAt | Date | 更新日期 | 
| website | string | 个人网站 | 
| zoneinfo | string | 时区 | 
最后点击「保存」。到此自定义外部社会化登录的设置就全部完成了,接下来我们来体验一下使用自定义社会化登录连接进行认证。
# 测试连接
进入控制台 > 应用 > 应用列表,随意选择一个应用,点击「体验」。

在登录页面,点击「使用 自定义社会化登录 登录」。

弹出的登录框中,在外部社会化登录身份源完成认证。

登录成功。

登录成功后跳转到回调地址,携带 code 授权码。

# 接下来你可能需要
使用授权码换取用户信息:
使用 OIDC 授权← 配置登录授权 Scope 微信登录 →