回环护照移动登录

13
我正在使用Loopback和Passport开发API。我看到了这个非常好的示例:https://github.com/strongloop/loopback-example-passport
在文档中,他们说Loopback通过以下步骤来通过第三方提供商验证用户:
  1. 访客通过由 LoopBack 支持的链接或按钮点击请求使用 Facebook 登录,并启动 oAuth 2.0 授权。
  2. LoopBack 将浏览器重定向到Facebook的授权终端,以便用户可以登录Facebook并授予权限给 LoopBack。
  3. Facebook将浏览器重定向到LoopBack托管的回调URL,其中包括oAuth 2.0授权代码。
  4. LoopBack 使用授权代码向 Facebook token 终端发送请求,以获取访问令牌。
  5. LoopBack 使用访问令牌检索用户的 Facebook 配置文件。
  6. LoopBack 根据 (provider, externalId) 在 UserIdentity 模型中搜索,以查看是否存在给定 Facebook id 的现有 LoopBack 用户。
    • 如果是,则将 LoopBack 用户设置为当前环境上下文;
    • 如果不是,则从配置文件中创建一个 LoopBack 用户,并在 UserIdentity 中创建相应的记录以跟踪第三方登录。将新创建的用户设置为当前环境上下文。
因此,我的问题是,假设一些用户使用移动应用程序获取访问令牌,那么我如何使用Loopback Passport对该用户的请求进行身份验证?
谢谢
2个回答

13
我之前开了一个关于同样问题的类似话题(如何将Loopback第三方登录集成到Android),后来找到了解决方案。
首先要说的是,Loopback用户可以同时拥有多个访问令牌。当您从网站或移动应用程序登录时,Loopback每次都会创建一个访问令牌。 如果您想获取访问令牌,已经有一种方法可以做到这一点,因此您可以使用登录方法获取访问令牌。
User.login({username: 'foo', password: 'bar'}, function(err, accessToken) {
   console.log(accessToken);
});

唯一需要做的就是从您的Android应用程序调用此托管方法。 您可以使用Loopback Android SDK(正确方式)或将用户名和密码发布到服务器并进行处理,就像这样简单。
app.post('/android/custom_login', function(req, res){
    var username = req.body.username;
    var password = req.body.password;

    User.login({username: username , password: password }, function(err, accessToken) {
      console.log(accessToken);
      return res.send(accessToken);
    });
});

如果您想让已登录的用户使用社交网络账户并获取访问令牌,我可以从谷歌场景中模拟一些事情。您还可以查看额外的loopback github test
app.post('/android/custom_login', function(req, res){
   var provider = 'google';
   var authSchema = 'oAuth 2.0';

   // oneTimeCode from android
   var oneTimeCode = req.body.oneTimeCode;

   // Make a request to google api
   // to exchange refreshToken and accessToken with using google apis
   var accessToken = 'FROM GOOGLE API';
   var refreshToken = 'FROM GOOGLE API';

   // external id is your google or facebook user id
   var externalId = 'FROM GOOGLE API';
   var email = 'FROM GOOGLE API';

   var credentials = {};
   credentials.externalId = externalId;
   credentials.refreshToken = refreshToken;

   var profile = {};
   profile.id = externalId;
   profile.emails = [{type:'account', value: email}];

   UserIdentityModel.login(
     provider, authSchema, profile, credentials , 
     {autoLogin:true}, function(err, loopbackUser, identity, token){
            if(err) throw err;
            // token is access token for thig login
            return res.send(token);
   });
});

在谷歌场景中,当用户点击登录按钮时,我会获取一个一次性代码。然后将该一次性代码发布到我的服务器以与访问令牌和刷新令牌进行交换。此外,在这里,我还从谷歌获取用户个人资料信息。
个人资料和提供者非常重要,因为UserIdentityModel.login()方法使用提供者和个人资料 ID(如果这些信息不存在),创建一个匿名用户。
最终,您将拥有安卓应用程序的访问令牌,如您所见。

2
  1. Use Loopback-Passport example
  2. From server.js, replace code as following

    app.get('/auth/account', ensureLoggedIn('/login'), function (req, res, next) {
        res.json(req.accessToken);
    
        });
    
  3. Using the accessToken from above line, you can use the LoopBack APIs.You can extend the code to create your own custom APIs.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接