具有基本身份验证和Angular2的Hapi服务器

时间:2018-03-03 18:29:22

标签: angular authentication hapijs

我是角色和哈皮的新人。 我想用一个简单的登录页面创建一个服务器和一个应用程序。 用户可以登录,然后他可以访问其他一些页面。

到目前为止,我有一台使用hapi-auth-basic方案身份验证的Hapi服务器

'use strict';

const Hapi = require('Hapi');

const users = {
    john: {
        username: 'john',
        password: '$2a$10$iqJSHD.BGr0E2IxQwYgJmeP3NvhPrXAeLSaGCj6IR/XU5QtjVu5Tm'   // 'secret'
    }
};

const validate = async (request, username, password, h) => {
    const user = users[username];
    if (!user) {
        return { credentials: null, isValid: false };
    }

    const isValid = await Bcrypt.compare(password, user.password);
    const credentials = { id: user.id, name: user.name };

    return { isValid, credentials };
};

const main = async () => {

    const server = new Hapi.Server({ 
        port: 3000,
        host: 'localhost',
        routes: { cors: true },
        debug: { request: ['*'] }
    });

    await server.register([
        require('hapi-auth-basic')
    ]);

    server.auth.strategy('simple', 'basic', { validate });
    server.auth.default('simple');

    server.route({
        method: 'GET',
        path: '/authenticate',
        handler: function (request, h) {
             return 'welcome';
        }
    });

    await server.start();
    return server;
};

main()
.then((server) => console.log(`Server listening on ${server.info.uri}`))
.catch((err) => {
    console.error(err);
    process.exit(1);
});

在Angular中我有我的登录页面,我喜欢向api服务器发送身份验证请求。

以下是auth-service.ts中调用服务器的函数

getRequestWithBasicAuth(user: User): Observable<any> {
    let data = btoa(user.name.toLowerCase() + ':' +  user.password);

    let headers = new HttpHeaders();
    headers.append("Content-Type", "application/json");
    headers.append("Authorization", "Basic " + data);

    return this.http.get(this.authenticateUrl, {headers: headers})
        .map((res: Response) => {
            let jsonObj: any;
            if (res.status === 204) {
                jsonObj = null;
            }
            else if (res.status === 500) {
                jsonObj = null;
            }
            else if (res.status === 200) {
                jsonObj = res.json()
            }
            return [{ status: res.status, json: jsonObj }]
        })
        .catch(error => {
            return Observable.throw(error);
        });
  }

Hapi控制台记录这个:

Debug: auth, unauthenticated, missing, simple core.js:122
    Error: Unauthorized

我找不到任何带有完整后端和前端代码的教程。 我尝试了几件事,我开始觉得基本的身份验证并不是我想要做的事情。但是,如果我在标题中正确发送凭据,它应该可以正常工作,对吗?

如何正确发送凭据? 我明白,使用基本身份验证,用户无法注销。我应该使用什么样的身份验证方案? 您对教程或文档有什么建议可以帮助我理解这一切吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Json Web Token(JWT)进行登录和身份验证 在角度+2中可以使用this package进行身份验证(JWT)