公共认证

Ally 是 AdonisJs 的第一方认证提供商。

使用 Ally 使通过第三方网站(如 Google, Twitter 和 Facebook )对用户进行身份验证变得微不足道。

Ally 提供支持以下驱动程序:

  • Facebook ( facebook )

  • Github ( github )

  • Google ( google )

  • Instagram ( instagram )

  • Linkedin ( linkedin )

  • Twitter ( twitter )

  • Foursquare ( foursquare )

建立

由于默认情况下未安装 Ally Provider ,我们需要从 npm 中提取它:

> adonis install @adonisjs/ally

接下来,在 start/app.js 文件中注册提供程序:

const providers = [
  '@adonisjs/ally/providers/AllyProvider'
]

社交身份验证配置保存在 config/services.js 文件中,该文件是 adonis install 在安装 Ally Provider 时由命令创建的。

配置

你的配置必须存储在 config/services.js 文件的 ally 对象中:

module.exports = {
  ally: {
    facebook: {}
  }
}

你始终可以在 Github 上访问最新的配置源文件。

基本例子

让我们从使用 Facebook 登录的基本示例开始。

首先,我们需要注册路由以将用户重定向到 Facebook ,然后在用户从 Facebook 重定向时处理响应:

Route.get('login/facebook', 'LoginController.redirect')
Route.get('facebook/callback', 'LoginController.callback')

确保正确配置了 Auth Provider 和 auth 相关的中间件。 接下来,我们需要创建控制器来实现我们的路由方法:

> adonis make:controller Login
const User = use('App/Models/User')

class LoginController {
  async redirect ({ ally }) {
    await ally.driver('facebook').redirect()
  }

  async callback ({ ally, auth }) {
    try {
      const fbUser = await ally.driver('facebook').getUser()

      // user details to be saved
      const userDetails = {
        email: fbUser.getEmail(),
        token: fbUser.getAccessToken(),
        login_source: 'facebook'
      }

      // search for existing user
      const whereClause = {
        email: fbUser.getEmail()
      }

      const user = await User.findOrCreate(whereClause, userDetails)
      await auth.login(user)

      return 'Logged in'
    } catch (error) {
      return 'Unable to authenticate. Try again later'
    }
  }
}

我们现在有几行代码的完整工作登录系统!

Ally 的 API 在驱动程序中是一致的,因此很容易 facebook 与 google 应用程序所需的交换或任何其他驱动程序交换。

Ally API

以下是可用功能列表。

redirect

将用户重定向到第三方网站:

await ally.driver('facebook').redirect()

getRedirectUrl

以字符串形式获取重定向网址:

const url = await ally.driver('facebook').getRedirectUrl()

return view.render('login', { url })

scope(scopesArray)

在重定向用户之前定义运行时作用域:

await ally
  .driver('facebook')
  .scope(['email', 'birthday'])
  .redirect()

查看相关提供商的官方 OAuth 文档,了解其可用范围列表。

fields(fieldsArray)

获取经过身份验证的用户配置文件时要获取的字段:

await ally
  .driver('facebook')
  .fields(['username', 'email', 'profile_pic'])
  .getUser()

getUser

获取经过身份验证的用户的用户配置文件(返回AllyUser实例):

await ally .driver('facebook') .fields(['email']) .getUser()

getUserByToken(accessToken,[accessSecret])

返回使用用户的详细信息 accessToken :

await ally.getUserByToken(accessToken)

这在使用客户端代码执行 OAuth 操作并且你有权访问 accesstoken 时很有用。

使用 OAuth 1 协议 accessSecret 时需要该参数(例如, Twitter 依赖于 OAuth 1 )。

用户API

以下是 AllyUser 实例上的可用方法列表。

getName

返回用户名:

const user = await ally.driver('facebook').getUser()

user.getName()

getEmail

返回用户电子邮件:

user.getEmail()

某些第三方提供商不共享电子邮件,在这种情况下此方法返回 null 。

getNickname

返回用户的昵称/显示名称:

user.getNickname()

getAvatar

返回用户个人资料图片的公共URL:

user.getAvatar()

getAccessToken

返回稍后可用于更新用户配置文件的访问令牌:

user.getAccessToken()

getRefreshToken

刷新令牌在访问令牌到期时使用:

user.getRefreshToken()

仅在第三方提供商实施 OAuth 2 时可用。

getExpires

访问令牌到期数据:

user.getExpires()

仅在第三方提供商实施 OAuth 2 时可用。

getTokenSecret

返回令牌密钥:

user.getTokenSecret()

仅在第三方提供商实施 OAuth 1 时可用。

getOriginal

第三方提供商返回的原始有效负载:

user.getOriginal()
最后一次更新: 7/6/2019, 9:38:14 PM