环回护照手机登录
Posted
技术标签:
【中文标题】环回护照手机登录【英文标题】:Loopback passport mobile login 【发布时间】:2015-06-11 18:47:02 【问题描述】:我正在开发一个带有环回和护照的 API。这个例子我看过,挺好的:
https://github.com/strongloop/loopback-example-passport
在文档中,他们说环回遵循此步骤通过第三方提供商对用户进行身份验证:
-
访问者通过单击链接或请求使用 Facebook 登录
LoopBack 支持的按钮,用于启动 oAuth 2.0 授权。
LoopBack 将浏览器重定向到 Facebook 的授权端点
这样用户就可以登录 Facebook 并授予 LoopBack 权限
Facebook 将浏览器重定向到 LoopBack 托管的回调 URL
使用 oAuth 2.0 授权码
LoopBack 向 Facebook 令牌端点发出请求以获取
使用授权码访问令牌
LoopBack 使用访问令牌检索用户的 Facebook
简介
LoopBack 通过 (provider, externalId) 搜索 UserIdentity 模型
查看给定 Facebook id 的现有 LoopBack 用户
如果是,则将 LoopBack 用户设置为当前上下文
如果没有,则从配置文件创建一个 LoopBack 用户并在 UserIdentity 中创建相应的记录以跟踪第 3 方登录。
将新创建的用户设置为当前上下文。
所以我的问题是,假设某个用户使用移动应用程序获取访问令牌,我如何使用 Loopback Passport 验证该用户的请求?
谢谢
【问题讨论】:
【参考方案1】:我打开了一个关于同一问题的类似主题,How integrate loopback third-party login for android。然后找到了解决方案。
首先,重要的是,环回用户可以同时拥有更多的访问令牌。当您从您的网站或移动应用程序登录时,loopback 每次都会创建一个访问令牌。
如果您要获取访问令牌,已经有办法做到这一点,因此您可以使用类似的登录方法获取访问令牌
User.login(username: 'foo', password: 'bar', function(err, accessToken)
console.log(accessToken);
);
您唯一需要做的就是从您的 Android 应用程序调用此托管方法。您可以使用环回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);
);
);
在谷歌场景中,当用户点击登录按钮时,我获得了一次性代码。然后将一次性代码发布到我的服务器,以便与访问令牌和刷新令牌进行交换。同样在这里,我从 google 获取用户个人资料信息。
Profile 和 provider 非常重要,因为 UserIdentityModel.login() 方法使用 provider 和 profile.id 创建了一个匿名用户(如果这些信息不存在)
如您所见,毕竟您将拥有一个用于 android 应用的访问令牌
【讨论】:
【参考方案2】:-
使用Loopback-Passport example
从 server.js 中,替换代码如下
app.get('/auth/account', ensureLoggedIn('/login'), function (req, res, next)
res.json(req.accessToken);
);
使用上面一行中的 accessToken,您可以使用 LoopBack API。您可以扩展代码以创建自己的自定义 API。
【讨论】:
以上是关于环回护照手机登录的主要内容,如果未能解决你的问题,请参考以下文章