今朝見た夢の話

登場人物・現実・夢の中の役

・西野七瀬・有名人・そのまま

・女子A・1回会った彼氏持ち女子・そのまま

・女子BとC・多分昔会ったことある女子二人組・そのまま

・大橋・中学の同級生・居酒屋の店主

・VIPな客・昔の客先の偉い人・そのままだけどSPが付いてた

・角井・小学校の同級生・邪魔してくる鬱陶しいやつ

・そのほか多分知ってるんだろうなって人多数

あらすじ

女子4人と大橋の居酒屋で合コンしていてなーちゃんを全力で口説く。

良い感じになるが角井(小学生時代の見た目で登場)に邪魔される。

お開きにしたところ、VIPな客が全額支払ってくれる。

店を出たところで女子Aの彼氏がレクサスで迎えに来たので靴紐を結ぶふりして他人のふりをする。

女子B、Cは早々に帰してなーちゃんを送る(しかもチャリで)。

知り合いっぽい奴らと合流してしまったので口説くのを諦める。

終わり。

感想

めっちゃかわいかった。

ファンになった。

4042079470

◆処理としては・・・
/ Authを使用してトークンを取得
(A)var token = this.auth.getIdToken();
/ トークンを元にユーザーグループを取得
(B)this.auth.checkUserAuthority(token);

/** idtokenを取得 */
(A)public async getIdToken(): Promise<string> {
① await Auth.currentSession()
     .then(session =>{
        this.cognitoUserSession = session;
        console.log(session);
     });
② return this.cognitoUserSession.getIdToken().getJwtToken();
}

/** ユーザーが所属するグループの権限をチェックする */
(B)public async checkUserAuthority(token:string){

     var decodedToken: any;
     var groupName:string;

/ トークンをデコードし、グループ名を取得
     try{
     ③ decodedToken = jwt_decode(token);
          groupName=decodedToken[‘cognito:groups’][0];
/ グループ名に「Administrator」が含まれていれば管理者アカウントとする
         this.isAdmin=groupName.includes(‘Administrator’);
     }
     catch(Error){
         decodedToken = null;
         groupName = null;
         this.isAdmin=false;
     }
     return;
}

◆はまったこと
なぜか①③②の順で処理されて、トークンがnullエラーになる。
Auth.currentSession()をawaitしているのになんでかわからなかった。

◆原因
Auth.currentSession()をawaitしているから①②③の順で処理されると思っていたが、
最初の(A)(B)がキューに入るため、①を処理している間に(B)の③が処理されてしまい
①が終わってから②を処理って振る舞いになっていた。

◆対策
(A)をawaitすると良かったかもしれないが、面倒なので(A)(B)を①メソッドに変更した

(765) 207-1143

・流れ
JWTを取得する。
JWTをデコードする。
グループ名を取り出す。

・JWTを取得する。
認証済みであれば
Auth.currentSession()
で取得可能。
戻り値、cognitoUserSession.getIdToken().getJwtToken()
にJWTがある。

※これはAuthカテゴリの使用方法に記載あるよ。

・JWTをデコードする。
以下コマンドでデコーダを導入する
npm install jwt-decode

インポート
import * as jwt_decode from “jwt-decode”;

使用例
getDecodedToken(取得したJWT: string): any {
 try{
  return jwt_decode(token);
 }
 catch(Error){
  return null;
 }
}

※戻り値はJSON

・グループ名を取り出す。
デコードしたトークン[‘cognito:groups’][0];
でJSONからグループ名を取得できた。

いせのじょうに行った

客先の近くにいせのじょうってラーメン屋があるって知って

ラッキーって思って昼に行った。

菊水の方はたまに行ってたけど菊水にいくこともなくなったから

久しぶりのいせのじょうだと思って勇んで入店。

辛口白菜を初めて食ったんだけどうめー思いながら不意に食べた

とんがりコーンみたいな物体、唐辛子だった。

汗吹き出して悶絶した上に水で腹タプタプになって吐きそうになった。

ガラスの胃腸だから案の定、ケツ穴炎上。

あと2回は波が来る見込み。

Cognito認証したユーザでS3ファイルアップロードを行う

前提条件
AWS Amplifyのバージョンがv1.1.19以上であること。
(v1.1.17ではどうやってもできなかった)

/ Storageモジュールの設定
Storage.configure({
    region: 'ap-southeast-1',
    identityPoolId: 'ap-southeast-1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    AWSS3: {
        bucket: 'バケットの名前',
        region: 'ap-southeast-1',
        identityPoolId: 'ap-southeast-1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    }
});


/ バケットの下に階層掘る場合
const customPrefix = {
  public: ぱす+'/',
  protected: ぱす+'/',
  private: ぱす+'/'
};


/ アップロード処理
await Storage.put('ファイル名', 'ファイルの中身', {
  customPrefix: customPrefix,
  level: 'private',
  contentType: 'text/plain'
})
.then (result => console.log(result))
.catch(err => console.log(JSON.stringify(Storage._config)));

※補足
levelはprivateやpublicを指定
contentTypeはいろいろあるので必要なら調べて

customPrefixを指定した場合、
バケット/指定したパス/IDPoolのIDというパスになる

AWS Amplifyでログレベルを下げて出力

    インポート
     import Amplify, { Storage, Auth, Logger } from 'aws-amplify';
    ログレベル変更
     Amplify.Logger.LOG_LEVEL = 'DEBUG';
    newする
     const logger = new Logger('foo', 'INFO');
    出力
     logger.debug('■■■■■■■Storage.configureのSTART■■■■■■■');

365-465-3425

前提
・SPAでログイン画面を実装している
・ログイン後の画面に、APIの実行ボタンを配置している
・Cognito ユーザープールにユーザーを登録している(ユーザーAとする)
・API GatewayにてAPIを2つ作成している

ゴール
・2つのAPIの一方は実行可能、一方は実行不可となるよう認可設定する

概要
・CognitoのグループにIAMロールを付与し、APIの実行可否を定義する
・API GatewayでIAM認証を設定する
・AWS Amplifyを使用しIDトークンを取得し、APIリクエストを行う

手順
【Cognito ユーザープールの設定】
①ユーザープールにグループを作成し、ユーザーAを登録する
②グループに対しIAMロールを付与する
※Cognitoコンソールから簡単にできます

【IAMポリシーの設定】
①グループに付与したIAMのポリシー、信頼関係を以下の通り編集する
・ポリシー
{
  “Version”: “2012-10-17”,
  “Statement”: [
  {
    “Action”: [
      “mobileanalytics:PutEvents”,
      “cognito-sync:*”,
      “cognito-identity:*”
    ],
    “Resource”: “*”,
    “Effect”: “Allow”
 },
{
  “Action”: [
    “execute-api:Invoke”
  ],
  / こっちは許可 ↓APIのARN
  “Resource”: “arn:aws:execute-api:ap-southeast-1:xxxxxxxxx:xxxxxxxxxxx/*/GET/”,
  “Effect”: “Allow”
},
{
  “Action”: [
    “execute-api:Invoke”
],
  / こっちは拒否 ↓APIのARN
  “Resource”: “arn:aws:execute-api:ap-southeast-1:yyyyyyyyy:yyyyyyyyyyy/*/GET/”,
  “Effect”: “Deny”
  }
 ]
}

・信頼関係
{
  “Version”: “2012-10-17”,
  “Statement”: [
    {
      “Effect”: “Allow”,
      “Principal”: {
        “Federated”: “cognito-identity.amazonaws.com”
      },
     “Action”: “sts:AssumeRoleWithWebIdentity”,
     “Condition”: {
     “StringEquals”: { / ↓IDプールのID
     “cognito-identity.amazonaws.com:aud”: “ap-southeast-xxxxxxxxxxxxxxx”
     },
    “ForAnyValue:StringLike”: {
    “cognito-identity.amazonaws.com:amr”: “authenticated”
     }
   }
 }
]
}

【フェデレーティッドアイデンティティの設定】
①認証されていないロール、認証されたロールを設定
→おそらくこれはユーザープールにいないユーザーに対してのロールのため今回は不問
②認証プロバイダー
→他社IDプロバイダーは利用しないため「Cognito」のみ設定
・ユーザープールID、アプリクライアントIDを設定
・トークンからロールを選択する
・デフォルトの認証されたロールを使用する
を選択して保存

【API Gatewayの設定】
①リソース→メソッドリクエスト より、認証に「AWS_IAM」を選択する
※IAM認証の場合はカスタムオーソライザーは不要
②アクションプルダウンより、CORSの有効化を行う
③デプロイを忘れずに

【AWS Amplifyを使ってAPIを呼ぶ】
インポート
import Amplify, { API,Auth } from ‘aws-amplify’;

APIの定義
Amplify.configure({
  API: {
    endpoints: [
    / 一般
    {
      name: “AmplifyTest1”,
      endpoint: “/xxxxxxxxxx.execute-api.ap-southeast-  1.amazonaws.com/test”,
      region: “ap-southeast-1”
    },
/ 管理者
   {
      name: “AmplifyTest2”,
      endpoint: “/yyyyyyyyyy.execute-api.ap-southeast-1.amazonaws.com/test”,
      region: “ap-southeast-1”,
    }
   ]
 }
});

IDトークンの取得
※Authカテゴリをインポートすること
Auth.currentSession()
→cognitoUserSession.getIdToken().getJwtToken();

APKの実行
※APIカテゴリをインポートすること
取得したIDトークンをヘッダーに設定
const httpOptions = {
custom_header: { Authorization: token }
};

getメソッド実行
API.get(‘AmplifyTest1’, ‘パスがあれば記述’, httpOptions)

(249) 285-7470

実装するときにどれを呼べばいいのかわからなかったので用途毎に残しておきます。
前提1:aws-amplifyライブラリを使う想定
前提2:多要素認証(MFA)が有効な場合を想定

~~~~~~~~~~~~~~~~~~~~~~~
import Amplify, { Auth } from ‘aws-amplify’;

※「Auth」は認証やサインアップ関連の機能が含まれている
~~~~~~~~~~~~~~~~~~~~~~~

◆サインアップ
Auth.signUp(username, password, phone_number);
※ユーザープール作成じの設定により必要な項目は変わる

◆検証(これをやらないとユーザープールのステータスが「確認」にならない)
Auth.confirmSignUp(username, code);
※code=EメールorSMSで受け取った検証コード
※Eメールと電話番号を登録した場合はSMSでの送信になる
※SNSの利用料が1通3円程度かかるので注意が必要(必要ならSNS利用料の上限を上げる。デフォルトは1USD)

◆ログイン(戻り値のcognitoUserがMFA認証コード入力時に必要)
public signIn(username, password): Observable<any> {
const that = this;
Auth.signIn(username, password)
.then(cognitoUser => {
if(cognitoUser.challengeName === ‘SMS_MFA’){
that.cognitoUser = cognitoUser;
}
});
return;
}

◆MFA認証コード入力(signInの戻り値を渡す必要あり)
public confirmSignIn(code): Observable<any> {
return from(Auth.confirmSignIn(this.cognitoUser, code, ‘SMS_MFA’)).pipe(
tap(() => this.loggedIn.next(true))
);
}
※code=SMSで受け取った認証コード

◆ログインユーザ情報の取得
Auth.currentAuthenticatedUser();

◆idtokenを取得
Auth.currentSession()
.then(session =>{
this.cognitoUserSession = session;
});
return this.cognitoUserSession.getIdToken().getJwtToken();
※API実行に必要なjwtトークンを取得するときなどに使う

◆ログイン状態の取得
Auth.currentAuthenticatedUser();
※未ログインならログイン画面に戻したいときに使用した

◆ログアウト
Auth.signOut();

Cloud9でAngular開発環境を作る

◆nodeのバージョンアップ
nvm install v8.14.0

◆Angular CLIインストール(クライアントだと思ったらコマンドラインインターフェースの略だった)
npm install -g @angular/cli

◆プロジェクトのひな形作成
ng new tkc-sample-app –style=scss

◆使用するパッケージのインストール
cd tkc-sample-app
npm i –save aws-amplify
npm i –save bootstrap && npm install –save jquery popper.js
npm i –save aws-sdk

◆サービス、コンポーネントを作成する場合
ng g service services/サービス名
ng g component component/コンポーネント名

◆tsconfig.app.json を編集
{
    “extends”: “../tsconfig.json”,
    “compilerOptions”: {
    “outDir”: “../out-tsc/app”,
    “types”: [“node”] ←ここを編集
},
~~~~~省略~~~~~

◆サーバー起動
ng serve –host 0.0.0.0 –port 8080 –disableHostCheck

◆補足
ngコマンドがつかえなくなった(ec2再起動→ideを開きなおすとngへのパスが通らなくなるっぽい)
alias ng=”/home/ec2-user/environment/tkc-sample-app/node_modules/@angular/cli/bin/ng”

ngコマンドがつかえなくなった②(ec2再起動→ideを開きなおすと使うnvmのバージョンが古くなるっぽい)
nvm use v8.14.0

Observableがエクスポート~のようなエラーがでたら
npm i rxjs-compat
→6.0から発生したらしい

global is not definedがでたら、polyfills.tsに以下追記
(window as any).global = window;

@angular/httpがcannot find moduleでエラーになったのでインストール
npm -g install –save @angular/http

9543015336

前提:bitnamiを使ってRedmineを構築したところ、SVNも同梱されていたのでこれを使う

◆リポジトリの作成
sudo mkdir repos
sudo chown -R daemon:daemon repos/
sudo -u daemon svnadmin create /opt/bitnami/repos/mar

◆Apacheの設定ファイル(/opt/bitnami/apache2/conf/httpd.conf )に以下の一文を追加。
Include “/opt/bitnami/apache2/conf/extra/httpd-svn.conf”

◆上記のファイルがないのでviで新規作成し、以下を追加。
<Location /svn>
    DAV svn
    SVNParentpath “/opt/bitnami/repos”
    SVNListParentPath On
    AuthType Basic
    AuthName “Subversion repository”
    AuthUserFile /opt/bitnami/apache2/conf/.htpasswd.svn
    Require valid-user
</Location>

◆phpのタイムゾーンを設定。
vi /opt/bitnami/php/etc/php.ini

◆ユーザー登録
(1人目)
htpasswd -c /opt/bitnami/svn/my-repository/users ゆーざー1

(ユーザ追加の場合)
htpasswd /opt/bitnami/svn/my-repository/users ゆーざー2

◆再起動する
sudo ./ctlscript.sh restart apache