我有一个角度应用程序,有时会为每个状态执行多个$ http.get请求.该应用程序使用JWT进行用户身份验证和刷新令牌.API服务器会发送401因auth错误而失败的每个请求.我做了一个http interceptor请求带有401错误的刷新令牌的新令牌,然后重新发送原始请求.
问题是,如果一个州例如2 $ http.get请求并且都得到401响应,那么我更新访问令牌两次.显然我只想刷新令牌一次,但我还是想重新发送两个失败的请求.
这是可以实现的,如果可以的话怎么样?
app.factory('AuthInterceptor', function($q, $injector, RESOURCE_URL, API_BASE, authService) {
return {
request: function(config) {
config.headers = config.headers || {};
if (authService.getAccessToken()) {
if (config.url.substring(0, RESOURCE_URL.length) !== RESOURCE_URL) {
config.headers.Authorization = 'Bearer ' + authService.getAccessToken();
}
}
return config;
},
responseError: function(response) {
switch (response.status) {
case 401:
var deferred = $q.defer();
$injector.get("$http").post(API_BASE + '/api/auth/refresh', {refreshtoken: authService.getRefreshToken()}).then(function(r) {
if (r.data.data.accesstoken && r.data.data.refreshtoken && r.data.data.expiresin) {
authService.setAccessToken(r.data.data.accesstoken);
authService.setRefreshToken(r.data.data.refreshtoken);
authService.setExpiresIn(r.data.data.expiresin);
$injector.get("$http")(response.config).then(function(resp) {
deferred.resolve(resp);
},function(resp) …Run Code Online (Sandbox Code Playgroud) 我想在线程之间有一个共享的结构。该结构体有许多从未被修改的字段和 a HashMap,即。我不想HashMap为单个更新/删除锁定整个,所以我HashMap看起来像HashMap<u8, Mutex<u8>>. 这有效,但没有意义,因为无论如何线程都会锁定整个地图。
这是这个工作版本,没有线程;我认为这个例子没有必要。
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
fn main() {
let s = Arc::new(Mutex::new(S::new()));
let z = s.clone();
let _ = z.lock().unwrap();
}
struct S {
x: HashMap<u8, Mutex<u8>>, // other non-mutable fields
}
impl S {
pub fn new() -> S {
S {
x: HashMap::default(),
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有可能吗?我在文档中遗漏了什么明显的东西吗?
我一直在努力让这个工作,但我不知道如何。基本上我看到的每个例子都有一个Mutex(或RwLock,或类似的东西)保护内在价值。
我在这里阅读了指南:https://angular.io/docs/ts/latest/guide/router.html
看起来非常简单,但是,我不确定如何在auth guard(canActivate)中使用angularfire2的身份验证.我试过的是:
AuthService
import { Injectable } from '@angular/core';
import { AngularFire } from 'angularfire2';
@Injectable()
export class AuthService {
private user: any;
constructor(private af: AngularFire) {
this.af.auth.subscribe(user => {
this.user = user;
})
}
get authenticated(): boolean {
return this.user ? true : false;
}
}
Run Code Online (Sandbox Code Playgroud)
AuthGuard
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router, private authService: AuthService) { }
canActivate(): Observable<boolean> | boolean {
if (this.authService.authenticated)
return true;
this.router.navigate(['/login']);
return …Run Code Online (Sandbox Code Playgroud) 这让我在过去几个小时里疯狂,我仍然无法找到解决方案......
基本上我将状态更改为何404时解析返回http 404状态代码.我正在改变状态$stateChangeError.一切正常,除非状态改变后,404它开始另一个状态改变回原来的状态,从而解决两次.状态本身仍然存在404,所以它毕竟是有效的,但它仍然会产生$http不需要的额外请求.但是,如果我使用$state.go('404', null, { location: false })OR,如果404状态根本没有定义URL ,它只会像这样工作.
如果我为404state(/404)定义了一个url ,那么一切正常.
这是2支钢笔,展示了这个问题:
失败的一个:http://codepen.io/cprfnaporf/pen/RaqmQN(调试模式,检查控制台:http://s.codepen.io/cprfnaporf/debug/RaqmQN/)
工作原理:http://codepen.io/cprfnaporf/pen/MyzdVQ(调试模式,检查控制台:http://s.codepen.io/cprfnaporf/debug/MyzdVQ/)
知道如何解决这个问题吗?我真的没有想法.
谢谢!
如标题中所述,无论我如何尝试Facebook登录,该emailVerified字段始终为假.这是设计的吗?我现在已经阅读了整个firebase文档,似乎无法找到有关此内容的任何信息.只是为了确定:我尝试了4个不同的验证帐户,结果总是一样的.知道什么可能导致这种行为吗?
我有@ ngrx/store和效果正常,但是,我刚刚意识到会有很多API调用(在效果中),如果其中任何一个返回401错误,我应该将用户重定向到登录页面.我的问题是:我不想在每一个效果中都检查一下,这对同样的事情来说是一个额外的代码.比方说,我有一个像这样的代码:
样本效果
@Effect() getMe$ = this.actions$
.ofType(GET_ME)
.map(action => action.payload)
.switchMap(payload => this.userService.me()
.map(res => ({ type: GET_ME_SUCCESS, payload: res }))
.catch(() => Observable.of({ type: GET_ME_FAILURE }))
);
Run Code Online (Sandbox Code Playgroud)
userService.me()
me(): Observable<User> {
return this.apiService.get(`/auth/me`);
}
Run Code Online (Sandbox Code Playgroud)
apiService.get()
get(endpoint: string): Observable<any> {
return this.http.get(`${this.base}${endpoint}`, this.options())
.map(res => res.json());
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但我不知道如何在API返回401时处理这种情况.在这种情况下,我应该在哪里全局重定向用户?我应该为该案件制定行动吗?那我应该在哪里发送这个动作呢?或者我完全错了吗?
任何正确方向的帮助将不胜感激!
我正在使用RC1和新路由器(不是已弃用的路由器).
我已经阅读了大部分博客和文档,但我真的找不到一种惯用的方法,特别是没有使用"新"路由器.到目前为止,我的应用程序"完美"工作,只是缺少一些东西:
Authorization在每个 http请求上添加令牌到标头?(就像Angular 1.x中的拦截器一样)40x响应,如果需要(意味着路由受到保护)导航到另一个URL?我不需要一个完整的演示或类似的东西,只需要几个要点,我应该去.
我已经有一个查询,如下所示:
{$match:{
"when":{$gt: new Date(ISODate().getTime() - 1000 * 60 * 60 * 24 * 30)}
}},
{$project:{
"year":{$year:"$when"},
"month":{$month:"$when"},
"day": {$dayOfMonth:"$when"}
}},
{$group:{
_id:{year:"$year", month:"$month", day:"$day"},
"count":{$sum:1}
}},
{$sort:{
_id: 1
}}
Run Code Online (Sandbox Code Playgroud)
结果如下所示:
{ "_id" : { "year" : 2015, "month" : 10, "day" : 19 }, "count" : 1 }
{ "_id" : { "year" : 2015, "month" : 10, "day" : 21 }, "count" : 2 }
Run Code Online (Sandbox Code Playgroud)
除了过去 30 天的结果,我怎么能以相同的格式获得结果,即使count是 0?
像这样:
{ "_id" : { …Run Code Online (Sandbox Code Playgroud) 我有一条路线,我想等到从firebase获取auth对象.这是我的代码:
路线
{
path: 'random',
component: RandomComponent,
resolve: { auth: AuthService }
}
Run Code Online (Sandbox Code Playgroud)
AuthService
@Injectable()
export class AuthService implements Resolve<any> {
constructor(private af: AngularFire) { }
resolve(): Observable<any> {
return this.af.auth.take(1);
}
}
Run Code Online (Sandbox Code Playgroud)
RandomComponent
export class RandomComponent {
constructor(private route: ActivatedRoute) {
console.log(this.route.snapshot.data);
}
}
Run Code Online (Sandbox Code Playgroud)
很奇怪它记录Object { },所以一个空对象.如果我将AuthService.resolve更改为return Observable.of('whatever'),那么它会记录Object { auth: "whatever" },所以我很确定这部分代码是有效的,只是因为某种原因,angularfire2 auth observable在这种情况下不起作用.(我真的不是一个可观察的专家,所以可能是我做错了什么).
如果我这样做,this.af.auth.take(1).subscribe(auth => console.log(auth));则记录auth对象,以便该部分也正常工作.
那是什么导致了这个问题呢?我究竟做错了什么?
(使用最新的路由器,angular2和angularfire2.)
由于某种原因mgo,即使我已经设置了omitempty选项,也将空结构插入到db as null值中.
package main
import (
"fmt"
"encoding/json"
)
type A struct {
A bool
}
type B struct {
X int `json:"x,omitempty" bson:"x,omitempty"`
SomeA *A `json:"a,omitempty" bson:"a,omitempty"`
}
func main() {
b := B{}
b.X = 123
if buf, err := json.MarshalIndent(&b, "", " "); err != nil {
fmt.Println(err)
} else {
fmt.Println(string(buf))
}
}
Run Code Online (Sandbox Code Playgroud)
json编码器省略了SomeA属性,但在数据库中它就像那样"a" : null.我做错了什么,或者根本不可能这样做?
我有一个JSON对象,如下所示:
{
"randomstring": {
"everything": "here",
"is": "known"
}
}
Run Code Online (Sandbox Code Playgroud)
基本上randomstring对象内部的一切都是已知的,我可以对其进行建模,但是randomstring本身是随机的.我知道它会是什么,但每次都不一样.基本上我需要的所有数据都在randomstring对象中.我怎么能解析这种JSON来获取数据?
我希望有某种“钩子”,只要我从数据库中获取特定类型的对象,它就会运行。我认为该Unmarshaler接口非常适合此目的,但是...我如何实现该接口,而无需自己手动解组每个字段?
我想做这样的事情:
func (t *T) UnmarshalBSON(b []byte) error {
// Simply unmarshal `b` into `t` like it would otherwise
bson.Unmarshal(b, t) // Obviously this won't work, it'll be an infinite loop
// Do something here
return nil
}
Run Code Online (Sandbox Code Playgroud)
在不使用 Reflect pkg 手动解组字段的情况下,如何实现此目的?