HarmonyOS 鸿蒙Next 基于华为云函数实现华为账号一键登录

HarmonyOS 鸿蒙Next 基于华为云函数实现华为账号一键登录客户端与服务端交互的方案分享

华为账号一键登录是一套基于先进的 OAuth 2.0 协议标准和 OpenID Connect 协议标准精心构建的强大 OAuth2.0 授权登录系统。它为各类应用带来了极为便捷的途径,使应用能够轻松获取华为账号用户丰富的身份标识信息以及手机号等关键数据,从而得以快速且高效地建立起应用内部完善的用户体系,极大地提升了用户接入和管理的效率。

其详细的调用流程如下:

image.png

在当今的移动应用开发环境中,为了确保用户登录流程的便捷性与安全性,华为账号一键登录功能发挥着重要作用。一般情况下,应用侧会部署一个专门的服务器,即应用服务器,其主要职责在于维护和管理用户信息。在整个华为账号一键登录过程中,应用服务器扮演着关键角色,它需要与华为账号服务器进行交互,以获取如 accessToken、refreshToken 等重要信息,从而实现流畅的一键登录体验。特别是当应用选择华为云开发作为其应用服务器解决方案,借助华为云强大的数据库、云存储和云函数等服务来维护用户信息时,了解如何在华为云函数中调用华为账号服务器的相关接口就显得尤为关键。接下来,我们将以获取用户级凭证为例,深入探讨云函数如何调用获取用户级凭证接口的具体实现过程。

下面以获取用户级凭证为例,来实现云函数如何调用获取用户级凭证接口。

承载协议

HTTPS POST

接口方向

开发者服务器->华为账号服务器

接口URL

https://oauth-login.cloud.huawei.com/oauth2/v3/token

数据格式

请求消息:Content-Type: application/x-www-form-urlencoded

响应消息:Content-Type: application/json;charset=UTF-8

 在项目的CloudProgram中的cloudfunctions新建get-token函数

const https = require('https');
const querystring = require('querystring');

let myHandler = async function (event, context, callback, logger) {
    try {
        // 从事件中提取参数
        var grant_type;
        var client_id;
        var client_secret;
        if (event.body) {
            var _body = JSON.parse(event.body);
            grant_type = _body.grant_type;
            client_id = _body.client_id;
            client_secret = _body.client_secret;
        } else {
            grant_type = event.grant_type;
            client_id = event.client_id;
            client_secret = event.client_secret;
        }
        console.info(`grant_type = ${grant_type} client_id = ${client_id}`)
        if (!grant_type || !client_id || !client_secret) {
            callback({
                statusCode: 400,
                body: JSON.stringify({
                    error: 'Missing required parameters: grant_type, client_id, and client_secret'
                }),
            }) ;
        }

        // 构建请求参数
        const params = querystring.stringify({
            grant_type,
            client_id,
            client_secret
        });
        // 发送 POST 请求
        const options = {
            hostname: 'oauth-login.cloud.huawei.com',
            port: 443,
            path: '/oauth2/v3/token',
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': params.length
            }
        };
        const req = https.request(options, (res) => {
            let data = '';

            res.on('data', (chunk) => {
                data += chunk;
            });

            res.on('end', () => {
                if (res.statusCode === 200) {
                    callback({
                        statusCode: 200,
                        body: data
                    });
                } else {
                    callback({
                        statusCode: res.statusCode,
                        body: JSON.stringify({
                            error: `Error calling Huawei Cloud API: ${res.statusCode} - ${data}`
                        })
                    });
                }
            });
        });

        req.on('error', (error) => {
            console.error('Error calling Huawei Cloud API:', error);
            callback({
                statusCode: 500,
                body: JSON.stringify({
                    error: 'An error occurred while calling the Huawei Cloud API.'
                })
            });
        });

        // 写入请求体
        req.write(params);
        req.end();
        // // 调用华为云的OAuth2令牌获取API
        // const response = await axios.post('https://oauth-login.cloud.huawei.com/oauth2/v3/token', null, {
        //     params: {
        //         grant_type,
        //         client_id,
        //         client_secret
        //     }
        // });
        //
        // // 返回获取到的令牌信息
        // callback({
        //     statusCode: 200,
        //     body: JSON.stringify(response.data),
        //     //body: JSON.stringify('response.data'),
        // });

    } catch (error) {
        console.error('Error calling Huawei Cloud API:', error);
        return {
            statusCode: 500,
            body: JSON.stringify({
                error: 'An error occurred while calling the Huawei Cloud API.'
            }),
        };
    }

    //callback(res);
};

module.exports.myHandler = myHandler;

在应用侧使用云函数调用:

    cloudFunction.call({
      name: 'get-token', data: {
        grant_type: 'client_credentials',
        client_id: 'xxxxxxxxxx',
        client_secret: 'xxxxxxxxxx'
      }
    }).then((res: cloudFunction.FunctionResult) => {
      let aa = JSON.stringify(res.result)
      aa
    }).catch((err: BusinessError) => {
      console.error('CloudFunction', 'call id-generator exception, ErrCode: %{public}d ErrMessage: %{public}s',
        err.code, err.message);
    });
	
	

其中

Request Body

参数

是否必选

参数类型

描述

grant_type

String

授权模式,固定传“authorization_code”。

client_id

String

在创建应用后,由华为开发者联盟为应用分配的唯一标识。应用OAuth 2.0客户端ID(凭据)-Client ID的查询方法,请参见查看应用基本信息

client_secret

String

在创建应用后,由华为开发者联盟为应用分配的公钥(Client Secret)。应用OAuth 2.0客户端ID(凭据)-Client Secret的查询方法,请参见查看应用基本信息

code

String

当“grant_type”为“authorization_code”时,此参数必选。获取方式详见LoginWithHuaweiIDResponseAuthorizationWithHuaweiIDResponse

以上就实现了华为云函数调用华为账号服务器相关接口的功能,其他功能类似。 


更多关于HarmonyOS 鸿蒙Next 基于华为云函数实现华为账号一键登录的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next 基于华为云函数实现华为账号一键登录的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next在基于华为云函数实现华为账号一键登录时,主要通过以下方式实现客户端与服务端的交互:

  1. 服务端配置:在华为云函数服务上部署认证逻辑,该逻辑接收来自客户端的请求,并调用华为账号服务API进行账号验证。确保服务端配置正确的API密钥和回调地址,以安全地完成账号认证流程。

  2. 客户端集成:客户端应用集成华为云SDK,通过SDK调用云函数,传递必要的认证信息(如token或用户凭证)。同时,客户端需处理云函数的响应,根据响应结果执行相应的UI操作,如显示登录成功或失败信息。

  3. 安全传输:整个交互过程采用HTTPS协议,确保数据传输的安全性。云函数与客户端之间的通信通过华为云提供的加密通道进行,防止数据泄露。

  4. 无缝体验:通过云函数实现后台逻辑处理,客户端无需处理复杂的认证逻辑,从而为用户提供更流畅、无缝的登录体验。用户只需点击一次登录按钮,即可完成整个认证流程。

  5. 扩展性:基于云函数的架构便于后续功能的扩展和维护,例如增加多因素认证、调整认证策略等,均可在服务端完成,无需修改客户端代码。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部