登入登出

登入

SDK 提供了快速登录小程序的接口,省去使用 百度登录接口时获取 code, session_key 等辅助操作。

建议的登录流程是,通过 swan.BaaS.auth.loginWithBaidu() 获取用户 openID, 这时无需弹框授权,开发者拿到 openID 可以建立自身的帐号 ID。当必须要获得用户的头像昵称等信息时,才让用户点击 button(open-type="getUserInfo" ),弹框授权。

静默登录

swan.BaaS.auth.loginWithBaidu(null, { createUser })

该方法会进行简单的登录,不需要用户授权,即不会弹出授权框。

参数说明

参数类型说明
createUserBoolean是否创建用户,默认为 true,可选

createUser 参数决定了一个新的 百度用户第一次登录时的服务端处理行为。默认为 true,服务端会有该用户创建一个知晓云用户记录。当 createUserfalse 时,服务端会终止登录过程,返回 404 错误码,开发者可根据该返回结果进行多平台账户绑定的处理。详见 多平台用户统一登录 说明

请求示例

  1. // 百度用户登录小程序
  2. swan.BaaS.auth.loginWithBaidu().then(user => {
  3. // 登录成功
  4. }, err => {
  5. // 登录失败
  6. })

登录成功返回示例then 回调中的 user 对象为 currentUser 对象,请参考currentUser 小节

登录失败返回示例

err 对象结构请参考错误码和 HError 对象

设置用户名和邮箱

用户通过 百度登录后,可以设置邮箱、用户名、密码,以便下次可以通过用户名或者邮箱登录。

详情请参考 更新用户名更新邮箱

请求用户授权

开发者需要提供按钮的方式,令用户触发授权操作

swan.BaaS.auth.loginWithBaidu(data, {createUser, syncUserProfile})

参数说明

参数类型说明
dataobjectbindgetuserinfo 事件回调返回的参数
createUserBoolean是否创建用户,默认为 true
syncUserProfileString是否同步第一层级用户信息,可选值为 overwritesetnxfalse,默认值为setnx

createUser 参数决定了一个新的 百度用户第一次登录时的服务端处理行为。默认为 true,服务端会有该用户创建一个知晓云用户记录。当 createUserfalse 时,服务端会终止登录过程,返回 404 错误码,开发者可根据该返回结果进行多平台账户绑定的处理。详见 多平台用户统一登录 说明

syncUserProfile 参数说明:

  • overwrite: 强制更新
  • setnx: 仅当字段从未被赋值时才更新
  • false: 不更新
  1. <button open-type="getUserInfo" bindgetuserinfo="userInfoHandler">用户授权</button>

用户点击该按钮时,会返回获取到的用户信息,其中包括加密的敏感信息,开发者需在回调中调用 swan.BaaS.loginWithBaidu 方法,以获得解密后的全部用户信息。

请求示例

  1. Page({
  2. // ...
  3. userInfoHandler(data) {
  4. swan.BaaS.auth.loginWithBaidu(data).then(user => {
  5. // user 包含用户完整信息,详见下方描述
  6. }, err => {
  7. // **err 有两种情况**:用户拒绝授权,HError 对象上会包含基本用户信息:id、openid;其他类型的错误,如网络断开、请求超时等,将返回 HError 对象(详情见下方注解)
  8. })
  9. },
  10. // ...
  11. })

用户同意授权返回示例then 回调中的 user 对象为 currentUser 对象,请参考currentUser 小节

用户拒绝授权示例 catch 回调中的 HError 对象示例:

  1. {
  2. "id": 61736923,
  3. "openid": "ofo380BgVHDSf3gz0QK1DYPGnLxx",
  4. "code": 603,
  5. "message": "unauthorized"
  6. }

其他错误catch 回调中的 res 对象示例:

res 对象结构请参考错误码和 HError 对象

swan.BaaS.auth.loginWithBaidu 默认会检查用户是否已登录,若未登录,该接口默认会先执行登录操作

关联百度小程序

UserRecord.linkBaidu(data, {syncUserProfile})

参数说明

参数类型说明
dataobjectswan.getUserInfo() success 回调中收到的参数,可选
syncUserProfileString是否同步第一层级用户信息,可选值为 overwritesetnxfalse,默认值为setnx

syncUserProfile 参数说明:

  • overwrite: 强制更新
  • setnx: 仅当字段从未被赋值时才更新
  • false: 不更新

请求示例

  • 不获取用户信息:
  1. // 必须在用户通过 login API 登录后才能进行绑定
  2. swan.BaaS.auth.login({username: 'ifanrx', password: '111111'}).then(user =>{
  3. // user 为 currentUser 对象
  4. return user.linkBaidu()
  5. }).then(res=>{
  6. // success
  7. // 用户可以通过微信授权登录同一个账户了
  8. })
  • 获取用户信息:
  1. <button open-type="getUserInfo" bindgetuserinfo="userInfoHandler">用户授权</button>
  1. Page({
  2. // ...
  3. userInfoHandler(data) {
  4. // 必须在用户通过 login API 登录后才能进行绑定
  5. swan.BaaS.auth.login({username: 'ifanrx', password: '111111'}).then(user =>{
  6. // user 为 currentUser 对象
  7. user.linkBaidu(data).then(res=>{
  8. // 关联成功
  9. console.log(res.statusCode)
  10. })
  11. })
  12. },
  13. // ...
  14. })

返回示例

  1. {
  2. "statusCode": 200,
  3. "data": {
  4. "message": "User associated.",
  5. "openid": "ofo380BgVHDSf3gxxx",
  6. "status": "ok",
  7. "user_id": 22051668672912
  8. }
  9. }

多平台用户统一登录

假设开发者现在同时支持百度小程序和 web 端登录,需要百度小程序新用户关联到已经注册好的用户账户,才能登录成功。可以通过 loginWithBaidu 的参数 createUser 设置为 false,此时,服务端会判断该用户是否已经有账户记录,如果没有,则返回 404 状态码。开发者可根据此状态码,跳转到需要填写用户名密码页面,进行已有账户的关联或新的账户的创建,完成后,调用 linkBaidu 方法完成当前百度小程序用户与账户的绑定。下一次用户再次登录时,则会直接登录成功。

示例代码

静默登录时检查

  1. // 设置 createUser 参数为 false,避免直接创建一个账户
  2. swan.BaaS.auth.loginWithBaidu(null, {createUser: false}).then(user => {
  3. // 已经有用户记录,不是第一次登录,进入正常业务流程。
  4. }, err => {
  5. // 登录失败,没有账户记录。
  6. // 这时候可以让用户先通过 swan.auth.register() 注册一个账户,或者 swan.auth.login() 登录一个已有账户,再使用 linkBaidu 进行绑定,这里以登录账户为例
  7. if (err.code === 404) {
  8. swan.BaaS.auth.login({email: 'ifanrx@ifanr.com', password: 'ifanrx123'}).then(user => {
  9. user.linkBaidu().then(res => {
  10. console.log(res.statusCode)
  11. // 关联成功,下次可以通过 swan.BaaS.auth.loginWithBaidu 登录了
  12. })
  13. })
  14. }
  15. })

请求用户授权后检查

  1. <button open-type="getUserInfo" bindgetuserinfo="userInfoHandler">用户授权</button>
  1. Page({
  2. // ...
  3. userInfoHandler(data) {
  4. swan.BaaS.auth.loginWithBaidu(data, {createUser: false}).then(user => {
  5. // 已经有用户记录,不是第一次登录,进入正常业务流程。
  6. }, err => {
  7. // **err 有两种情况**:用户拒绝授权,HError 对象上会包含基本用户信息:id、openid;其他类型的错误,如网络断开、请求超时等,将返回 HError 对象(详情见下方注解)
  8. // 这时候可以让用户先通过 swan.auth.register() 注册一个账户,或者 swan.auth.login() 登录一个已有账户,再使用 linkBaidu 进行绑定,这里以登录账户为例
  9. if (err.code === 404) {
  10. swan.BaaS.auth.login({email: 'ifanrx@ifanr.com', password: 'ifanrx123'}).then(user => {
  11. user.linkBaidu(data.detail).then(res => {
  12. console.log(res.statusCode)
  13. // 关联成功,下次可以通过 swan.BaaS.auth.loginWithBaidu 登录了
  14. })
  15. })
  16. }
  17. })
  18. },
  19. // ...
  20. })

若已经提前申请了用户授权,也可以在 swan.getUserInfo() 的 success 回调中进行关联账户

  1. swan.getUserInfo({
  2. success(res) {
  3. swan.BaaS.auth.getCurrentUser().then(user => {
  4. user.linkBaidu(res)
  5. })
  6. }
  7. })