如何使用AWS Lambda或Google Cloud Functions将Zendesk Mobile SDK与Firebase集成?

大家都知道,您可以使用JWT(JSON Web令牌)对Zendesk Mobile SDK的用户进行身份验证。 此外,还有很多HOWTO-s,它们显示了针对许多不同编程语言的JWT实现。 在本教程中,我将向您展示如何使用Google Cloud Functions,NodeJS和其他一些npm附加功能来为Zendesk Mobile SDK创建完全可扩展且完全免费的无服务器JWT身份验证后端。

为什么选择Google?

当然,您可以使用AWS Lambda函数来实现类似的解决方案,但是我个人认为,使用单个产品(Google Firebase)进行iOS后端操作要容易得多,然后再使用AWS的几个服务。 因此,主要原因是Firebase。 同时,Google为您的所有服务提供了出色的日志记录解决方案,因此您无需实施任何特殊的操作并重新发明轮子。 只需对您的所有服务使用单一解决方案。 第三个是API。 我个人认为,Google的API是我见过的最好的API。 只有Google为您提供大多数错误的详细说明,并为您提供指向其控制台的直接URL链接,例如,启用所需的服务。

什么是无服务器,云功能和Lambda?

可以将其视为基于容器技术的轻量级PaaS托管,但存在一些局限性,这使得该技术超级快速且可扩展。 此托管存储您的代码段,这些代码段可以独立启动以解决一个简单的问题(例如,调用Web服务的另一功能,将某些内容保存到数据库或发送电子邮件),这些代码可以在一个时间短。 每当其他云服务触发它或像传统Web服务一样通过HTTP / HTTPS协议直接调用它时,您的代码段就会在容器内启动。

为什么使用无服务器(AWS Lambda或CloudFunctions)?

我们仍然不会不花心思地使用每种解决方案所需的资源。 我们仍然使用一半负载的VM来支持较长的基础架构扩展时间或具有在Kubernetes集群中启动其他容器的能力。 在云的情况下,我们要为这些未使用的资源付费。 不了解您,但我不想这样做。 云功能的使用使我们更加节俭地使用可用资源,同时,它使我们能够比使用VM甚至容器的情况下更快地进行扩展。 因此,借助CloudFunctions,我们可以使用云的本质而无需考虑我们的Web服务可伸缩性。 当然,所有云提供商都支持无服务器技术,因此,您无需考虑诸如供应商锁定之类的事情。 您可以随时轻松切换云提供商。

无服务器后端

首先,我假设您已经拥有:

  • Google Firebase帐户(如果您不使用Firebase,也可以使用传统的Google Cloud)并在其中创建了Project。
  • 您已经安装了Firebase SDK for Cloud Functions,并为您的云功能创建了初始项目结构。
  • 您已阅读有关编写HTTP云功能的信息

之后,您将可以轻松在Node.js上编写类似的代码。将以下代码添加到index.js文件中,以创建名为jwt_auth的云函数:

  “使用严格”; 

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config()。firebase);
var jwt = require('jwt-simple');
var uuid = require('uuid');
var url = require('url');

var subdomain ='dev-ops-notes'; //您的Zendesk子域
var shared_key ='.....'; // Zendesk提供了共享密钥

Exports.jwt_auth =函数.https.onRequest((req,res)=>
//如果要取消注释以下代码
//console.log('Request method',req.method);
//console.log('Request:',req);
//console.log('Body:',req.body);
//console.log('Query:',req.query);

如果(!req.body.user_token)
console.error('URL中未提供jwt令牌');
res.status(401).send('Unauthorized');
返回;


const jwt_token = req.body.user_token;

console.log(“正在验证令牌...”);
admin.auth()。verifyIdToken(jwt_token).then(decodedIdToken =>
console.log('ID令牌已正确解码',encodedIdToken);
让用户= decodedIdToken;

var displayName = user.email;
如果(user.displayName!= null)
displayName = user.displayName;


var有效负载=
iat:(new Date()。getTime()/ 1000),
jti:uuid.v4(),
名称:displayName,
电子邮件:user.email
;

//编码
var token = jwt.encode(payload,shared_key);
console.log('Token',令牌)
var redirect ='https://'+子域+'.zendesk.com / access / jwt?jwt ='+令牌;

var query = url.parse(req.url,true).query;

if(query ['return_to'])
重定向+ ='&return_to ='+ encodeURIComponent(query ['return_to']);

console.log('重定向响应',重定向)
让响应=
“ jwt”:令牌


res.status(200).send(响应)
返回;
).catch(错误=>
console.error('验证Firebase ID令牌时出错:',错误);
res.status(401).send('Unauthorized');
返回;
);

);

在上面的代码中,我们导入了一些其他依赖项

  • firebase-functions -具有访问HTTP请求(req)和响应(res)对象及其属性的功能。
  • firebase-admin –具有访问Firebase身份验证功能的能力(例如,检查用户令牌或凭据)
  • jwt-simple –这是一个小库,可让我们形成正确的JWT响应
  • uuid – lib,用于为Zendesk的JWT令牌生成随机UUID
  • url – lib,用于解析HTTP请求查询字符串并处理Zendesk提供给您的redirect_url参数,以记住用户来自哪个页面,因此我们可以将其包含在请求中,并在以后传递

检查HTTP请求中是否存在user_token参数,如果未找到该参数,则响应401 Unauthorized 。 之后,我们将使用verifyIdToken方法在请求中验证Firebase用户令牌,如果成功,该方法将向我们返回Firebase用户信息。 之后,我们将形成JWT响应结构(有关更多详细信息,请参见JWT请求的剖析),从Zendesk请求中添加return_to信息,并通过包含JWT令牌的正文发送回200 OK HTTP响应。 现在是时候转到functions目录并安装所有必需的依赖项:

  $ npm安装firebase功能 
$ npm安装firebase-admin
$ npm install jwt-simple
$ npm安装uuid
$ npm安装网址

现在,您可以使用以下命令部署云功能:

  firebase deploy --only功能 

在命令输出中,您将看到函数URL,我们需要在下一步将其提供给Zendesk Mobile SDK配置(类似us-central1-.cloudfunctions.net )。

Zendesk配置

首先,您需要在帐户管理页面上启用Mobile SDK:

然后,我们需要转到Mobile SDK配置的设置,然后单击“ 添加应用 ”按钮

在“移动应用程序设置”中,执行以下操作:

  • 在“设置”选项卡上填写应用程序的名称 ,然后启用JWT身份验证方法。
  • 用在云功能部署期间获得的URL填充JWT URL
  • JWT Secret放入shared_key变量,然后再次部署该函数,以使用与您已使用的命令相同的命令对其进行更新。
  • 如果需要,在“支持SDK”选项卡上启用Zendesk指南和对话支持。

现在,您可以在iOS应用程序中使用Zendesk Mobile SDK。

将Zendesk Mobile SDK与JWT身份验证结合使用

我不会重复这份出色的Zendesk教程,只是观看视频并按照以下步骤将Zendesk支持嵌入到您的移动应用中。 将在此处添加一些内容。

  • 如果要将Zendesk支持作为UITabBarItem嵌入,请遵循以下教程:快速入门– iOS支持SDK
  • 如果要像往常一样使用Zendesk支持UIViewController ,只需使用以下代码启动它:
  URLProtocol.registerClass(ZDKAuthenticationURLProtocol.self) 
让jwtUserIdentity = ZDKJwtIdentity(jwtUserIdentifier:idToken)
ZDKConfig.instance()。userIdentity = jwtUserIdentity
让helpCenterContentModel = ZDKHelpCenterOverviewContentModel.defaultContent()
ZDKHelpCenter.presentOverview(自己,带有:helpCenterContentModel)

让我们回到iOS App中的JWT身份验证。 JWT身份验证过程的完整过程如下所示:为Support SDK构建专用的JWT端点。 本文非常重要,因为它显示了如果出现问题,如何使用curl调试身份验证过程。 重要说明 :在大多数情况下,常见错误是配置错误的JWT令牌,该令牌通常不包含以下4个必须拥有的字段:

  • iat
  • jti
  • name
  • email

接下来,您需要在启动Zendesk支持UIViewController之前向Zendesk提供当前用户信息。 如果您在应用中将Firebase用作用户的身份验证后端,则只需在“获取支持” UIButton操作中使用以下代码即可:

 如果让currentUser = Auth.auth()。currentUser 
currentUser.getTokenForcingRefresh(true,完成:(idToken,错误)在
如果让错误=错误
debugPrint(“获取用户令牌时出错:%@”,错误)
其他
URLProtocol.registerClass(ZDKAuthenticationURLProtocol.self)
让jwtUserIdentity = ZDKJwtIdentity(jwtUserIdentifier:idToken)
ZDKConfig.instance()。userIdentity = jwtUserIdentity
//创建要传递的内容模型
让helpCenterContentModel = ZDKHelpCenterOverviewContentModel.defaultContent()
ZDKHelpCenter.presentOverview(自己,带有:helpCenterContentModel)

在这里,我们从Firebase获取当前用户令牌( idToken ),配置ZDKJwtIdentity对象并将其提供给Zendesk支持视图( helpCenterContentModel ),然后再启动它。 而已。 现在,您可以使用有史以来最激动人心的支持平台为用户提供专业支持! #Aws,#Firebase,#GoogleCloud,#Ios,#Nodejs,#Swift,#Zendesk https://goo.gl/GJzTqG https://goo.gl/GJzTqG