保留 Azure 移动服务的自定义 API 调用的用户身份验证

preserving user authentication for customAPI calls of azure mobile services

本文关键字:调用 用户 身份验证 API 自定义 移动 服务 保留 Azure      更新时间:2023-09-26

我在我的混合应用程序中使用了AzureMobileServices自定义API。自定义API名称是"userUtils"。登录和身份验证部分效果很好,我能够使用 facebook/google oAuth 对用户进行身份验证。登录后,在其完成函数中,我调用一个自定义API函数 - 插入(http POST) - 如果尚未添加,则基本上将用户添加到docDB中。并将用户详细信息返回给我的JS客户端。(我已将此自定义API的"POST"权限设置为"具有应用程序密钥的用户"(顺便说一句,此权限设置是否正确,还是应该是"仅经过身份验证的用户"?

        //below code is part of a typescript file
        this._zumoClient = new WindowsAzure.MobileServiceClient( "https://abcdefExample.azure-mobile.net/", "someExampleApplicationKey");
        ... 
        ....    
        ....    
        public authenicateUser(p_oAuthProvider: string) {
            var p: Promise<any> = new Promise(
                (resolve: (result: any) => void, reject: (err: any) => void) =>
                    this._zumoClient.login(p_oAuthProvider, null).done(
                        (loginResult) => {
                            console.log("login returned with result : " + loginResult.userId);
                            var theUserAuthId = loginResult.userId;
                            this._zumoClient.invokeApi('UserUtils/insert', {
                                method: 'POST',
                                body: { userAuthId: theUserAuthId }
                            })
                                .done(
                                (loginResult: any) => {
                                    resolve(loginResult)
                                },
                                (loginErr: any) => {
                                        reject(loginErr);
                                }
                                );
                        },
                        (loginErr: any) => {
                            reject(loginErr);
                        }
                    )
            );
            return p;
        }

对我的自定义API的第一次"调用API"效果很好。

但是,在稍后的一点上,我尝试调用另一个自定义API"usersSocialContacts"(http GET),我得到401 - "未经授权的请求"(我已将"get"权限设置为"仅经过身份验证的用户"对于此自定义API)。

public getUserSocialContacts() {
    var p: Promise<any> = new Promise(
        (resolve: (result: any) => void, reject: (err: any) => void) =>
            this._zumoClient.invokeApi('UserUtils/userSocialContacts', {
                method: 'GET'
            })
            .done(
                (contactsResult: any) => {
                    console.log("got contacts -" + JSON.stringify(contactsResult));
                    resolve(contactsResult);
                },
                (contatcsErr: any) => {
                    reject(contatcsErr);
                }
            )

    );
    return p;
}

如果我将此自定义API的GET权限设置为"允许用户使用应用程序密钥",则调用api函数,但request.user未定义。

这是如何工作的,如何让自定义 API 让知道该用户已经过身份验证,并在每个请求中从 js 客户端传递用户。我阅读了一些 SO 问题或其他谷歌搜索中的一些建议,以缓存用户的身份验证令牌并在登录调用中使用可选的过滤器对象将其在每个请求中传递给 zumo 服务,找到了一些 C#/.net 的示例,但没有找到任何清晰的示例或文档 javascript 客户端,也许我错过了。Azure 文档提供了从 js 客户端调用自定义 API 的 js 示例,但未显示缓存部分并在后续请求中发送经过身份验证的用户。

希望在这方面有任何知识共享或任何指向正确文档的指示。

如果您只想登录用户访问自定义 api,则需要将权限设置为"仅经过身份验证的用户"。

用户登录后,如果您使用的是移动服务客户端的同一实例(未注销),则对 zumo 服务发出的任何请求都应包含 zumo 身份验证令牌。